![]() |
Unterschied TTread.Synchronize / TThread.Queue
Hallo,
ich habe gerade male eine Verständnisfrage zur Verwendung von TThread.Synchronize und TThread.Queue. Beide proceduren verwendet man ja im Prinzip, um von einem Thread außerhalb des MainThreads auf Daten bzw. GUI-Elemente des Hauptthreads zuzugreifen. Während ich bei der Verwendung der beiden Proceduren bislang in TTask keinen großen Unterschied bemerkt habe, frage ich mich gerade, warum in dem folgenden TParallel-For Beispiel der Aufruf mit Queue funktioniert, der mit Synchronize sich aber aufhängt:
Delphi-Quellcode:
Mir ist durchaus bekannt, dass Synchronize eine "blocking" Methode ist, "Queue" aber nicht, dennoch hätte ich angenommen, dass die Abarbeitung grundsätzlich hier auch mit Synchronize funktionieren würde. Tut es aber nicht.
procedure TForm14.Button1Click(Sender: TObject);
var L: Integer; begin Listbox1.Clear; TParallel.For (1,10, procedure (i:Integer) begin //TThread.Synchronize(NIL, //--> funktioniert nicht, Programm hängt TThread.Queue(NIL, // das geht procedure begin ListBox1.Items.Add( 'Nummer' + i.tostring); end); end); end; Hat jemand eine Erklärung dafür? |
AW: Unterschied TTread.Synchronize / TThread.Queue
Du bleibst ja während der Ausführung der einzelnen Threads im Hauptthread im Aufruf von TParallel.For. Deshalb können die anderen Threads in dieser Zeit auch nicht mit dem Hauptthread synchronisieren, da der gleichzeitig auf die einzelnen Schleifenthreads wartet.
Das ist ein klassischer Deadlock. |
AW: Unterschied TTread.Synchronize / TThread.Queue
Verstehe ich das richtig, dass TParallel.for dann so eine Art Mischung zwischen Ablauf im Hauptthread und eigener Thread ist?
Im Gegensatz zu TTask, was ja wirklich ein eigener Thread ist, daher kann man dort beides (also Queue oder Synchronize) verwenden? |
AW: Unterschied TTread.Synchronize / TThread.Queue
Du kannst das in deinem Beispiel sehen, wenn du nach dem TParallel.For einfach noch eine Zeile
Delphi-Quellcode:
einfügst.
ListBox1.Items.Add('Ende');
|
AW: Unterschied TTread.Synchronize / TThread.Queue
Das
Delphi-Quellcode:
ist wie ein
TParallel.&For()
Delphi-Quellcode:
Und dort würde auch ein Synchronize einen Deadlock erzeugen.
LTask := Task.Run( ... );
LTask.Wait(); |
AW: Unterschied TTread.Synchronize / TThread.Queue
Zitat:
Zitat:
Aber grundsätzlich Danke, ich glaube, ich komme der Sache vom Verständnis her näher. |
AW: Unterschied TTread.Synchronize / TThread.Queue
Zitat:
Das kannst du sehr gut an diesem Beispiel sehen:
Delphi-Quellcode:
Du wirst sehen, dass die Messagebox "Nachher" erst angezeigt wird, wenn die beiden anderen bestätigt sind. Das kannst du aber ja auch einfach mit einem Haltepunkt sehen.
MessageBox(0, 'Vorher', 'Test', 0);
TParallel.For (1,2, procedure (i:Integer) begin MessageBox(0, PChar(i.ToString), 'Test', 0); end); MessageBox(0, 'Nachher', 'Test', 0); |
AW: Unterschied TTread.Synchronize / TThread.Queue
Da in
Delphi-Quellcode:
eben genau dieses
TParallel.&For
Delphi-Quellcode:
gemacht wird, muss/kann man es damit vergleichen.
Wait
|
AW: Unterschied TTread.Synchronize / TThread.Queue
Aber in TParallel laufen doch im besten Fall mehrere Threads parallel ab (hoffentlich).
Und das TaskWait kommt für alle am Ende, oder nicht ? Wie sollte man das den jetzt aufbauen damit es threadsafe wird, geht das überhaupt ? Die Strings z.B. in TDictionary o.ä zwischenspeichern, und dann nach der TParallel Schleife in die Listbox übertragen ? Oder die gute alte TStringList ? Dann würden zwar die Berechnungen parallel laufen, aber die Übertragung in die Listbox wieder im Hauptthread. Dann wäre doch das TParallel in solchen Fällen nicht besonders sinnvoll, nur da wo es keine Inputs zu Komponenten im Hauptthread geben muss. Oder gibt es eine Konstellation wie man das auch mit TListBox parallel hinbekommt ? Rollo |
AW: Unterschied TTread.Synchronize / TThread.Queue
Zitat:
Es sollte also in dem Fall einfach ein Thread für die ursprüngliche Verarbeitung gestartet werden und schon ist das Problem gelöst. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:45 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 by Thomas Breitkreuz