Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Probleme beim Warten auf 2 Threads (https://www.delphipraxis.net/81392-probleme-beim-warten-auf-2-threads.html)

RWarnecke 26. Nov 2006 13:07


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:
  TSearchCopy = class(TThread)
  private
    { Private-Deklarationen }
  public
    procedure Execute; override;
  end;

  TSearchDelete = class(TThread)
  private
    { Private-Deklarationen }
  public
    procedure Execute; override;
  end;
So erstelle ich meine Classen für die Threads.

Delphi-Quellcode:
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;
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 :
Delphi-Quellcode:
repeat
  Application.ProcessMessages;
until (SearchForCopy.Terminate) and (SearchForDelete.Terminate);
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 ?

karlkoch 26. Nov 2006 13:13

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

RWarnecke 26. Nov 2006 13:20

Re: Probleme beim Warten auf 2 Threads
 
Wenn ich jetzt

Delphi-Quellcode:
SearchForCopy.WaitFor;
SearchForDelete.WaitFor;
Dort einsetze kommt nach kurzer Zeit die Fehlermeldung
Zitat:

Thread-Fehler: Das Handle ist ungültig(6)
. Desweitern wird nichtsmehr in dem Fenster von der Suche angezeigt.

Habe ich eventuell etwas falsch gemacht ?

Muetze1 26. Nov 2006 13:31

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...

RWarnecke 26. Nov 2006 13:46

Re: Probleme beim Warten auf 2 Threads
 
Ich habe das ganze jetzt mal im Einzelschritt ausgeführt. Wenn ich dann die Zeile
Delphi-Quellcode:
SearchForCopy.WaitFor;
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 ?

thkerkmann 26. Nov 2006 13:50

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

RWarnecke 26. Nov 2006 14:00

Re: Probleme beim Warten auf 2 Threads
 
Erstmal ein dickes Danke an Thomas. Ich habe das ganze jetzt so gelöst :
Delphi-Quellcode:
      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;
Kann mir jetzt noch jemand erklären, warum ich die TThreads selber freigeben muss und nicht über FreeOnTerminate ?

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 ?

thkerkmann 26. Nov 2006 14:24

Re: Probleme beim Warten auf 2 Threads
 
Zitat:

Zitat von RWarnecke
Erstmal ein dickes Danke an Thomas. Ich habe das ganze jetzt so gelöst :
Delphi-Quellcode:
      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;
Kann mir jetzt noch jemand erklären, warum ich die TThreads selber freigeben muss und nicht über FreeOnTerminate ?

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 ?

Ich nochmal...

So hatte ich das nicht gemeint - hier laufen jetzt die zwei hintereinander ab.

Besser wäre

Delphi-Quellcode:
      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;
So können die beiden Threads parallel laufen.

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

RWarnecke 26. Nov 2006 14:36

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 ?

thkerkmann 26. Nov 2006 14:57

Re: Probleme beim Warten auf 2 Threads
 
Ach ja.....

Dann war dein erster Ansatz doch nicht so schlecht....

Delphi-Quellcode:
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.
Dies anstelle der WaitFor eingesetzt sollte helfen.

Allerdings auch hier wichtig - FreeOnTerminate auf false lassen und am Ende selber freigeben.

Gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:34 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