AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Thread - warten bis alle Berechnungen fertig
Thema durchsuchen
Ansicht
Themen-Optionen

Thread - warten bis alle Berechnungen fertig

Ein Thema von Jens01 · begonnen am 29. Aug 2011 · letzter Beitrag vom 30. Aug 2011
Antwort Antwort
Seite 1 von 2  1 2      
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#1

Thread - warten bis alle Berechnungen fertig

  Alt 29. Aug 2011, 17:06
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
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#2

AW: Thread - warten bis alle Berechnungen fertig

  Alt 29. Aug 2011, 17:12
MSDN-Library durchsuchenWaitForMultipleObjects
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Thread - warten bis alle Berechnungen fertig

  Alt 29. Aug 2011, 17:15
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

AW: Thread - warten bis alle Berechnungen fertig

  Alt 29. Aug 2011, 17:19
Falls du mit der TThread Klasse arbeitest:
Delphi-Referenz durchsuchentthread.onterminate
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

AW: Thread - warten bis alle Berechnungen fertig

  Alt 29. Aug 2011, 17:20
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.
Andreas
  Mit Zitat antworten Zitat
WladiD

Registriert seit: 27. Jan 2006
Ort: Celle
135 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Thread - warten bis alle Berechnungen fertig

  Alt 29. Aug 2011, 17:39
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;
Waldemar Derr
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#7

AW: Thread - warten bis alle Berechnungen fertig

  Alt 29. Aug 2011, 18:10
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#8

AW: Thread - warten bis alle Berechnungen fertig

  Alt 29. Aug 2011, 18:22
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#9

AW: Thread - warten bis alle Berechnungen fertig

  Alt 29. Aug 2011, 18:27
@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.
  Mit Zitat antworten Zitat
SvB

Registriert seit: 21. Okt 2004
Ort: Eckenroth
426 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

AW: Thread - warten bis alle Berechnungen fertig

  Alt 30. Aug 2011, 00:48
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.
Sven

Alle sagen, das geht nicht. Da kam einer, der wusste das nicht und hat es gemacht.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:09 Uhr.
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