AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme beim Warten auf 2 Threads

Offene Frage von "RWarnecke"
Ein Thema von RWarnecke · begonnen am 26. Nov 2006 · letzter Beitrag vom 11. Dez 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#1

Probleme beim Warten auf 2 Threads

  Alt 26. Nov 2006, 13:07
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 ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
karlkoch

Registriert seit: 26. Feb 2006
Ort: Leipzig
30 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Probleme beim Warten auf 2 Threads

  Alt 26. Nov 2006, 13:13
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
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#3

Re: Probleme beim Warten auf 2 Threads

  Alt 26. Nov 2006, 13:20
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 ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Probleme beim Warten auf 2 Threads

  Alt 26. Nov 2006, 13:31
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...
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#5

Re: Probleme beim Warten auf 2 Threads

  Alt 26. Nov 2006, 13:46
Ich habe das ganze jetzt mal im Einzelschritt ausgeführt. Wenn ich dann die Zeile
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 ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Probleme beim Warten auf 2 Threads

  Alt 26. Nov 2006, 13:50
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
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#7

Re: Probleme beim Warten auf 2 Threads

  Alt 26. Nov 2006, 14:00
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 ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Probleme beim Warten auf 2 Threads

  Alt 26. Nov 2006, 14:24
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
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#9

Re: Probleme beim Warten auf 2 Threads

  Alt 26. Nov 2006, 14:36
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 ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Probleme beim Warten auf 2 Threads

  Alt 26. Nov 2006, 14:57
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
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  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 20:13 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