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:
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;
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.
Hat jemand eine Erklärung dafür?