![]() |
Probleme beim Warten auf 2 Threads
Hallo,
ich probiere schon seit langem rum, wie ich auf 2 Threads warten kann. Ich habe jetzt folgende Ausgangssituation :
Delphi-Quellcode:
So erstelle ich meine Classen für die Threads.
TSearchCopy = class(TThread)
private { Private-Deklarationen } public procedure Execute; override; end; TSearchDelete = class(TThread) private { Private-Deklarationen } public procedure Execute; override; end;
Delphi-Quellcode:
Und so starte ich es. In der Execute-Procedure wird nach Dateien gesucht. Dieses wird auch sauber angezeigt und funktioniert auch soweit sehr gut. Ich habe schon versucht, auf die beiden Threads mit :
procedure TMainForm.BtnCopyClick(Sender: TObject);
begin . . . // Fenster anzeigen, wo er gerade sucht ProgressWindow.Visible := not ProgressWindow.Visible; SearchForCopy := TSearchCopy.Create(false); SearchForDelete := TSearchDelete.Create(false); // hier soll gewartet werden, bis die beiden Threads fertig sind // denn hier folgt weitere Sourcecode, der nach dem ausführen der Threads ausgeführt werden soll . . . end;
Delphi-Quellcode:
zu warten, was aber leider nicht zum Erfolg führt. Wie kann ich das anderst machen ? Muss ich eventuell den Aufruf ändern oder das warten auf die Threads ?
repeat
Application.ProcessMessages; until (SearchForCopy.Terminate) and (SearchForDelete.Terminate); |
Re: Probleme beim Warten auf 2 Threads
Mit TThread.WaitFor kannst du auf einen Thread warten. Dieser Aufruf wartet solange, bis die Execute-Funktion des Threads beendet wird.
Wenn du währenddessen noch Dinge erledigen willst, dann sollten die Threads einfach z.B. einen Status setzen, den du abfragst. karlkoch |
Re: Probleme beim Warten auf 2 Threads
Wenn ich jetzt
Delphi-Quellcode:
Dort einsetze kommt nach kurzer Zeit die Fehlermeldung
SearchForCopy.WaitFor;
SearchForDelete.WaitFor; Zitat:
Habe ich eventuell etwas falsch gemacht ? |
Re: Probleme beim Warten auf 2 Threads
Vermutlich wartet er im ersten Thread mit dem WaitFor bis dieser beendet ist. Und wenn dies eingetreten ist ruft er WaitFor vom zweiten Thread auf - der hatte aber die Wartezeit auf den ersten Thread genutzt und ist schon beendet.
Meine Vermutung... |
Re: Probleme beim Warten auf 2 Threads
Ich habe das ganze jetzt mal im Einzelschritt ausgeführt. Wenn ich dann die Zeile
Delphi-Quellcode:
ausführe, passiert auf dem Bildschirm für kurze Zeit garnichts und dann kommt der Fehler aus meinem letzten Beitrag. Gibt es noch andere Möglichkeiten auf Threads zu warten ?
SearchForCopy.WaitFor;
|
Re: Probleme beim Warten auf 2 Threads
Hi,
setzt mal die property FreeOnTerminate deiner beiden Threads auf false. Du musst dann natürlich nach den beiden WaitFor's die Threads selber freigeben Dann sollte es gehen. Gruss |
Re: Probleme beim Warten auf 2 Threads
Erstmal ein dickes Danke an Thomas. Ich habe das ganze jetzt so gelöst :
Delphi-Quellcode:
Kann mir jetzt noch jemand erklären, warum ich die TThreads selber freigeben muss und nicht über FreeOnTerminate ?
try
SearchForCopy := TSearchCopy.Create(false); SearchForCopy.FreeOnTerminate := False; SearchForCopy.WaitFor; SearchForDelete := TSearchDelete.Create(false); SearchForDelete.FreeOnTerminate := False; SearchForDelete.WaitFor; finally SearchForCopy.Free; SearchForDelete.Free; end; Jetzt habe ich nur noch das Problem, das mein Statusfenster zwar geöffnet wird aber nichts anzeigt von dem was meine beiden Threads macht. Wie löse ich das jetzt noch ? |
Re: Probleme beim Warten auf 2 Threads
Zitat:
So hatte ich das nicht gemeint - hier laufen jetzt die zwei hintereinander ab. Besser wäre
Delphi-Quellcode:
So können die beiden Threads parallel laufen.
try
SearchForCopy := TSearchCopy.Create(true); // create suspended ! SearchForCopy.FreeOnTerminate := False; SearchForDelete := TSearchDelete.Create(true); // create suspended ! SearchForDelete.FreeOnTerminate := False; SearchForCopy.Resume; // thread laufen lassen SearchForDelete.Resume; // thread laufen lassen SearchForCopy.WaitFor; // warte auf Ende SearchForDelete.WaitFor; // warte auf Ende finally SearchForCopy.Free; SearchForDelete.Free; end; Das mit dem Freigeben hat folgenden Sinn: Damit das WaitFor überhaupt funktioniert - darf sich der Thread am Ende nicht selber freigeben, sonst bekommst Du eine Zugriffsverletzung. Also musst Du das selber erledigen. Gruss |
Re: Probleme beim Warten auf 2 Threads
Danke Dir Thomas für die Erklärung. Ich habe aber jetzt immer noch das Problem, dass in meinem Fenster nichts angezeigt wird durch das WaitFor. Wie kann ich das jetzt noch bereinigen ?
|
Re: Probleme beim Warten auf 2 Threads
Ach ja.....
Dann war dein erster Ansatz doch nicht so schlecht....
Delphi-Quellcode:
Dies anstelle der WaitFor eingesetzt sollte helfen.
repeat
Application.ProcessMessages; sleep(1); // lass den Threads auch eine Chance zu arbeiten. until (SearchForCopy.Terminated) and (SearchForDelete.Terminated); // achtung !! Terminated abfragen, nicht Terminate aufrufen. Allerdings auch hier wichtig - FreeOnTerminate auf false lassen und am Ende selber freigeben. Gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 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-2025 by Thomas Breitkreuz