AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread Synchronize Fragen

Ein Thema von Glados · begonnen am 10. Jul 2017 · letzter Beitrag vom 13. Jul 2017
Antwort Antwort
Seite 1 von 2  1 2      
Der schöne Günther

Registriert seit: 6. Mär 2013
6.202 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: Thread Synchronize Fragen

  Alt 10. Jul 2017, 09:48
Richtig, Queue() ist asynchron, Synchronize() ist synchron (höhö)

PS: Doch, genau in dem Fall willst du ganz sicher NICHT einen asynchronen Aufruf verwenden. Denn das Setzen auf fünf passiert praktisch garantiert NACH deiner Abfrage.
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#2

AW: Thread Synchronize Fragen

  Alt 10. Jul 2017, 09:49
Könnte mein oben genanntes Problem denn eintreten?
i := 5 ist nur ein Beispiel.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.202 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Thread Synchronize Fragen

  Alt 10. Jul 2017, 10:19
Du hast zwei Möglichkeiten: Synchron (TThread.Synchronize(..) ) und asynchron (TThread.Queue(..) )

Wenn du die Auswirkungen/Resultate/Rückgaben des Codes den du im Kontext eines anderen Threads ausführen möchtest direkt brauchst, dann brauchst du TThread.Synchronize(..)
Das "Problem" wird garantiert auftreten, hier noch einmal das gleiche Beispiel, nur etwas ausführlicher:
Delphi-Quellcode:
procedure TForm17.Button1Click(Sender: TObject);
begin
   TThread.CreateAnonymousThread(
      procedure()
      var
         capturedVariable: Integer;
      begin
         capturedVariable := 100;
         TThread.Queue(
            nil,
            procedure()
            begin
               capturedVariable := 42;
            end
         );

         case capturedVariable of
            100:
               Beep();
            42:
               begin
                  Beep();
                  Beep();
               end;
         else
            Beep(); Beep(); Beep();
         end;
      end
   ).Start();
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.401 Beiträge
 
Delphi 12 Athens
 
#4

AW: Thread Synchronize Fragen

  Alt 10. Jul 2017, 10:22
SendMessage und PostMessage synchronisieren sich selbstständig,
die Messages werden im Erstellungsthread der Komonenten verarbeitet, also innerhalb der MessageLoop. (bei der VCL im Hauptthread).

PostMessage ist asynchron (ist wie Queue)
SendMessage ist synchron (wie Synchronize)

Achtung: TThread.Queue im Haupthtread aufgerufen ist synchron, also wie Synchronize (k.A. wer da auf diese schwachsinnige Idee gekommen ist)
[edit] Seit wann gibt es ForceQueue?
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (10. Jul 2017 um 10:25 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.202 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Thread Synchronize Fragen

  Alt 10. Jul 2017, 10:28
Seit 10.1 Berlin
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#6

AW: Thread Synchronize Fragen

  Alt 10. Jul 2017, 10:30
Zitat:
Das "Problem" wird garantiert auftreten, hier noch einmal das gleiche Beispiel, nur etwas ausführlicher:
Danke für das Beispiel. Dann werde ich Queue nur da anwenden, wo ich die Daten nicht sofort brauche (das heißt GUI-Änderungen und keine Variablen die ich unmittelbar nach dem Queue brauche).

Zitat:
SendMessage und PostMessage synchronisieren sich selbstständig,
Woran kann das den liegen, dass sich hier rein gar nichts tut? Laut diesem Beitrag soll es ja angeblich funktionieren https://www.entwickler-ecke.de/topic..._106970,0.html
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.401 Beiträge
 
Delphi 12 Athens
 
#7

AW: Thread Synchronize Fragen

  Alt 10. Jul 2017, 10:35
CriticalSection
MultiReaderSingleWriter
Interlocked


Interlocked: Setzen von Integer, Booleans (LongBool) usw., also allem mit "4 Byte", bzw. in Registergröße.
Delphi-Referenz durchsuchenInterlockedIncrement/MSDN-Library durchsuchenInterlockedIncrement, InterlockedDecrement, InterlockedExchange, ..., bis hin zu Assembler (LOCK)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#8

AW: Thread Synchronize Fragen

  Alt 10. Jul 2017, 10:37
Zitat:
CriticalSection
MultiReaderSingleWriter
Interlocked
Ich verstehe nicht, was das jetzt mit SendMessage und der ProgressBar zu tun hat.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.401 Beiträge
 
Delphi 12 Athens
 
#9

AW: Thread Synchronize Fragen

  Alt 10. Jul 2017, 10:45
Ich verstehe nicht, was das jetzt mit SendMessage und der ProgressBar zu tun hat.
Hier gab es auch genügend andere Beispiele mit Variablen, du hattest einmal von "Variablen" gesprochen und auch im Titel geht es allgemain um Synchronisierung.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Thread Synchronize Fragen

  Alt 10. Jul 2017, 10:52
Ich verstehe nicht, was das jetzt mit SendMessage und der ProgressBar zu tun hat.
Du hast im Hauptformular ein Progressbar (MainThread), und einen Thread der "Datenschaufelt". Dieser sendet per SendMessage/PostMessage an das Hauptformular immer wieder eine Statusmeldung mit dem aktuellen Zählerstand. Wenn das Hauptformular Zeit hat wird es dann die Progressbar aktualisieren.

So ist die grobe Richtung.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz