![]() |
Wie auf 2 Threads warten?
Hi,
Ich möchte zuerst 2 Threads starten, auf deren Beendigung warten und dann einen weiteren starten und wiederum auf diesen warten und erst dann die Variable "i" hochzäheln. Leider krieg ich das überhaupt nicht hin :( . so funktionierts schonmal nicht, bekomme diverse Fehlermeldungen:
Delphi-Quellcode:
Danke schon mal für die Hilfe
procedure TMainForm.btBackupClick(Sender: TObject);
var i : integer; hHandles : array[0..1] of THandle; begin for i := 0 to lvSourceDestination.Items.Count - 1 do begin TtSearchSourceFiles.create(true); TtSearchDestFiles.create(true); TtSearchSourceFiles.sSourceDir := lvSourceDestination.Items[i].SubItems[0]; TtSearchDestFiles.sDestDir := lvSourceDestination.Items[i].SubItems[1]; TtSearchSourceFiles.Resume; TtSearchDestFiles.Resume; hHandles[0] := TtSearchSourceFiles.Handle; hHandles[1] := TtSearchDestFiles.Handle; case msgWaitForMultipleObjects(2,hHandles,true,INFINITE,QS_PAINT) of WAIT_OBJECT_0 + 0 and WAIT_OBJECT_0 + 1: begin TtSortFiles.Create(false); end end; end; end; |
Re: Wie auf 2 Threads warten?
Wenn dein Programm während des Laufs der (beiden) Threads sowieso blockiert (was WFMO ja verursacht) könntest du es auch so machen:
Delphi-Quellcode:
Entsprechend für die Einzelthreadversion anpassen, obwohl ich mich da frage, warum nen einzelnen Thread, auf den gewartet wird? :gruebel:
while (not Thread1.Terminated) or (not Thread2.Terminated) do
begin Application.ProcessMessages; Sleep(100); end; PS: Ich nehme mal an, TtSearchSourceFiles ist eine Variable. Dann erstellst du die aber mit TDeinThreadTypName.Create(), nicht DeinVariablenName.Create() ;) |
Re: Wie auf 2 Threads warten?
Hi,
Hab das Tut. von Luckie schon durchgelesen. es scheint nicht so richtig rübergekommen zu sein, wie ich das haben möchte. Also nochmal: Formular soll bedienbar bleiben zum z.B. abbrechen Zitat:
Problem hab ich beim resumen vom Hauptthread aus
Delphi-Quellcode:
Fehlermeldung:
TtSearchSourceFiles.Resume
Zitat:
Delphi-Quellcode:
Fehlermeldung:
TtSearchSourceFiles.sSourceDir := lvSourceDestination.Items[i].SubItems[0];
Zitat:
|
Re: Wie auf 2 Threads warten?
Delphi-Quellcode:
Der Thread aus dem du MyThread startest wartet, bis MyThread wieder beendet ist und macht dann weiter. :)
MyThread.Resume;
MyThread.WaitFor; // nächste Aktion durchführen |
Re: Wie auf 2 Threads warten?
Hi,
nach langem Probieren hab ichs hinbekommen und zwar so: Oberflächen Unit:
Delphi-Quellcode:
Thread:
procedure TMainForm.btBackupClick(Sender: TObject);
var i : integer; begin for i := 0 to lvSourceDestination.Items.Count - 1 do begin TtSearchSourceFiles.create(true); TtSearchDestFiles.create(true); TtSearchSourceFiles(Self{[hier lag der Fehler!!}).sSourceDir := lvSourceDestination.Items[i].SubItems[0]; TtSearchDestFiles([Self).sDestDir := lvSourceDestination.Items[i].SubItems[1]; TtSearchSourceFiles([Self).Resume; TtSearchDestFiles(Self).Resume; TtSortFiles.Create(false); end end; Den entscheidenden 3. Thread auf die ersten zwei per Event und WaitForMultipleObjects warten lassen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:11 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