Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wie auf 2 Threads warten? (https://www.delphipraxis.net/68118-wie-auf-2-threads-warten.html)

C.Schoch 24. Apr 2006 22:13


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:
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;
Danke schon mal für die Hilfe

Dax 25. Apr 2006 13:59

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:
while (not Thread1.Terminated) or (not Thread2.Terminated) do
begin
  Application.ProcessMessages;
  Sleep(100);
end;
Entsprechend für die Einzelthreadversion anpassen, obwohl ich mich da frage, warum nen einzelnen Thread, auf den gewartet wird? :gruebel:

PS: Ich nehme mal an, TtSearchSourceFiles ist eine Variable. Dann erstellst du die aber mit TDeinThreadTypName.Create(), nicht DeinVariablenName.Create() ;)

C.Schoch 25. Apr 2006 17:07

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:

Hauptthread // started alle 4 threads
| |
Thread1 Thread2 // laufen gleichzeitig
\ /
Thread3 // warted auf 1 und 2
|
Thread4 // warted auf 1, 2 und 3
habs jetzt mal vorerst mit Events gelöst.


Problem hab ich beim resumen vom Hauptthread aus
Delphi-Quellcode:
TtSearchSourceFiles.Resume
Fehlermeldung:
Zitat:

E2076 Diese Form des Methodenaufrufs ist nur für Klassenmethoden erlaubt
Und beim übergeben der Variablen:
Delphi-Quellcode:
 TtSearchSourceFiles.sSourceDir := lvSourceDestination.Items[i].SubItems[0];
Fehlermeldung:
Zitat:

E2096 Methodenbezeichner erwartet
woran liegts? (bestimmt wieder an mir, aber ich steig durch die Fehlerbeschreibung(Hilfe) nicht durch :wall: :wall: )

ste_ett 25. Apr 2006 17:10

Re: Wie auf 2 Threads warten?
 
Delphi-Quellcode:
  MyThread.Resume;
  MyThread.WaitFor;

//  nächste Aktion durchführen
Der Thread aus dem du MyThread startest wartet, bis MyThread wieder beendet ist und macht dann weiter. :)

C.Schoch 25. Apr 2006 18:53

Re: Wie auf 2 Threads warten?
 
Hi,
nach langem Probieren hab ichs hinbekommen und zwar so:

Oberflächen Unit:
Delphi-Quellcode:
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;
Thread:
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