![]() |
Thread Synchronize Fragen
Ich versuche seit ein paar Tagen meinen Thread zu optimieren, sodass ich ohne Synchronize arbeiten kann. Hierzu ein paar Fragen:
- muss ich das Setzen eines Tray-Icon-Hints synchronisieren? - wie kann ich Position und Hint einer ProgressBar ohne Synchronize setzen? Ich habe meinem Thread das Handle meiner ProgressBar übergeben und dann folgendes versucht
Delphi-Quellcode:
Leider tut sich dabei exakt nichts! PostMessage funktioniert auch nicht.
ProgressBarHandle:; THandle;
SendMessage(ProgressBarHandle, PBM_SETPOS, 55, 0); Aktuell verwende ich
Delphi-Quellcode:
statt Synchronize.
TThread.ForceQueue()
|
AW: Thread Synchronize Fragen
Synchronize blockiert deinen Thread bis der Befehl abgearbeitet wurde. Für das Setzen eines Hints oder eine Fortschrittsanzeige ist diese Synchronizität aber gar nicht notwendig. Hier kannst du auch einfach
Delphi-Quellcode:
einsetzen, was deinen Thread eben nicht blockiert, sonst aber dasselbe macht.
Queue
Delphi-Quellcode:
ist nur dann sinnvoll, wenn der Aufruf sowohl aus einem Neben- als auch aus dem Hauptthread erfolgen kann.
ForceQueue
|
AW: Thread Synchronize Fragen
Kann man also festhalten Queue ist besser als Synchronize?
Zitat:
Verstehe ich das richtig? Synchronize synchronisiert sofort und erst wenn das fertig ist geht es nach meinem Befehl, der in Synchronize() steht weiter und Queue packt den Aufruf in eine ART Stack, es geht aber sofort weiter? Nur kann Queue dann nicht Probleme machen wenn man folgendes Szenario hat?
Delphi-Quellcode:
Könnte es denn jetzt passieren, dass
var i: Integer;
i := 2; TThread.Queue(nil, procedure begin i := 5; end); if i = 5 then begin end;
Delphi-Quellcode:
ins Queue gesetzt wird aber erst so spät ausgeführt wird, dass
i := 5
Delphi-Quellcode:
nicht zutrifft, da i ja noch 2 ist?
if i := 5
Oder denke ich hier falsch? |
AW: Thread Synchronize Fragen
Richtig,
Delphi-Quellcode:
ist asynchron,
Queue()
Delphi-Quellcode:
ist synchron (höhö)
Synchronize()
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. |
AW: Thread Synchronize Fragen
Könnte mein oben genanntes Problem denn eintreten?
i := 5 ist nur ein Beispiel. |
AW: Thread Synchronize Fragen
Du hast zwei Möglichkeiten: Synchron (
Delphi-Quellcode:
) und asynchron (
TThread.Synchronize(..)
Delphi-Quellcode:
)
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
Delphi-Quellcode:
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; |
AW: Thread Synchronize Fragen
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? |
AW: Thread Synchronize Fragen
Seit 10.1 Berlin 8-)
|
AW: Thread Synchronize Fragen
Zitat:
Zitat:
![]() |
AW: Thread Synchronize Fragen
CriticalSection
MultiReaderSingleWriter Interlocked Interlocked: Setzen von Integer, Booleans (LongBool) usw., also allem mit "4 Byte", bzw. in Registergröße. ![]() ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 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