![]() |
Thread - warten bis alle Berechnungen fertig
Hallo ..,
ich habe derzeit 2 Threads, die jeweils aufwendige Berechnungen durchführen. Wenn beide Threads fertig sind, sollen die Ergebnisse gezeichnet und angezeigt werden. Wie kann ich auf diese Threads reagieren/ warten? Derzeit nutzte ich einen Timer, der abfragt, ob beide Threads finished sind. Das halte ich aber für sehr unelegant. Hat jemand einen Tipp für mich? Gruss Jens |
AW: Thread - warten bis alle Berechnungen fertig
|
AW: Thread - warten bis alle Berechnungen fertig
Lass jeden Thread beim Beenden einen Event feuern
Im Hauptprogramm merkst du dir ja schon die Threads. Jetzt brauchst du nur noch bei dem Event zu schauen, ob alle Threads fertig sind. |
AW: Thread - warten bis alle Berechnungen fertig
|
AW: Thread - warten bis alle Berechnungen fertig
Die beiden Threads müssten von einer weiteren Klasse verwaltet werden.
Diese Klasse merkt sich intern die Threadobjekte in einer Liste. Das Event OnTerminate eines jeden Threads wird auf einen Eventhandler der Verwaltungsklasse gerichtet. Somit bekommt die Verwaltungsklasse mit, wieviele Threads noch laufen und wann der letzte beendigt wurde. Jetzt wird es ein kleines bisschen unangenehm: Da das Event OnTerminate im Kontext eines Threads läuft darf man nicht einfach auf die VCL direkt zugreifen. Daher schickt die Verwaltungsklasse eine userdefined Windows-Message an das übergeordnete Formular. Die Verwaltungsklasse benötigt dazu das Fensterhandle. In dem Formular wird dann auf die Windows-Message regiert und getan was getan werden muss. |
AW: Thread - warten bis alle Berechnungen fertig
Zitat:
Hier der Code-Ausschnitt aus Classes.pas (D2007):
Delphi-Quellcode:
procedure TThread.CallOnTerminate;
begin if Assigned(FOnTerminate) then FOnTerminate(Self); end; procedure TThread.DoTerminate; begin if Assigned(FOnTerminate) then Synchronize(CallOnTerminate); end; |
AW: Thread - warten bis alle Berechnungen fertig
Wow, ich war nur mal kurz draußen...
Ich glaube ich habe die Lösung.... So ich habe das versucht :
Delphi-Quellcode:
Thread1 und Thread2 feuern hier drauf. Aber der jeweilige fertige Thread stellt wohl Finished und Terminated erst nach dem Event auf True. So war das eigene Finished immer noch auf False.
procedure TDLT.OnThreadTerminate(Sender: TObject);
begin if Thread1.Finished and Thread2.Finished then Show; end; Ich habe jetzt die Eventprocedure aufgeteilt. Jetzt fragt der jeweils fertig werdene Thread den anderen, ob er schon fertig ist :
Delphi-Quellcode:
procedure TtDLT.OnThread1Terminate(Sender: TObject);
begin if Thread2.Finished then Show; end; procedure TDLT.OnThread2Terminate(Sender: TObject); begin if Thread1.Finished then Show; end; |
AW: Thread - warten bis alle Berechnungen fertig
Delphi-Quellcode:
Bei mehreren Threads kann man das, über eine Schleife, ganz hübsch zusammenfassen.
procedure TDLT.OnThreadTerminate(Sender: TObject);
begin if ((Sender = Thread1) and Thread2.Finished) or ((Sender = Thread2) and Thread1.Finished) then Show; end; |
AW: Thread - warten bis alle Berechnungen fertig
@himitsu
Meine Lösung war noch nicht so elegant, Du hast recht. Ich beführte aber auch, dass ich das irgendwie in eine Liste bekommen muß, so wie shmia das schon angedeutet hat. Es werden bestimmt noch mehr Threads, die ich da verwalten muss. |
AW: Thread - warten bis alle Berechnungen fertig
Ich kann Dir da die
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:10 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