Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Thread - warten bis alle Berechnungen fertig (https://www.delphipraxis.net/162564-thread-warten-bis-alle-berechnungen-fertig.html)

Jens01 29. Aug 2011 16:06

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

Meflin 29. Aug 2011 16:12

AW: Thread - warten bis alle Berechnungen fertig
 
MSDN-Library durchsuchenWaitForMultipleObjects

Sir Rufo 29. Aug 2011 16:15

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.

jfheins 29. Aug 2011 16:19

AW: Thread - warten bis alle Berechnungen fertig
 
Falls du mit der TThread Klasse arbeitest:
Delphi-Referenz durchsuchentthread.onterminate ;-)

shmia 29. Aug 2011 16:20

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.

WladiD 29. Aug 2011 16:39

AW: Thread - warten bis alle Berechnungen fertig
 
Zitat:

Zitat von shmia (Beitrag 1120172)
Da das Event OnTerminate im Kontext eines Threads läuft darf man nicht einfach auf die VCL direkt zugreifen.

Das stimmt nicht. OnTerminate ist ein synchronisierter Event, d.h. von dort aus kann man völlig problemlos auf die VCL zugreifen.

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;

Jens01 29. Aug 2011 17:10

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:
procedure TDLT.OnThreadTerminate(Sender: TObject);
begin
  if Thread1.Finished and Thread2.Finished then
    Show;
end;
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.

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;

himitsu 29. Aug 2011 17:22

AW: Thread - warten bis alle Berechnungen fertig
 
Delphi-Quellcode:
procedure TDLT.OnThreadTerminate(Sender: TObject);
begin
  if ((Sender = Thread1) and Thread2.Finished) or ((Sender = Thread2) and Thread1.Finished) then
    Show;
end;
Bei mehreren Threads kann man das, über eine Schleife, ganz hübsch zusammenfassen.

Jens01 29. Aug 2011 17:27

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.

SvB 29. Aug 2011 23:48

AW: Thread - warten bis alle Berechnungen fertig
 
Ich kann Dir da die OmniThreadLibrary empfehlen. Man muss sich zwar erst mal mit den Tutorials und Demos beschäftigen. Hört sich jetzt etwas schlimm an, aber nimm Dir da ruhig mal ein paar Stunden Zeit. Du hast damit aber sehr viele Möglichkeiten. Ich benutze da im Moment nur einen Bruchteil davon, das funktioniert aber sehr gut.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:47 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz