Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Thread nach Terminate wieder starten (https://www.delphipraxis.net/170769-thread-nach-terminate-wieder-starten.html)

Alex_ITA01 2. Okt 2012 15:11

Thread nach Terminate wieder starten
 
Hallo zusammen,
ich stehe grad bisschen auf dem Schlauch aber ich wollte hierzu dann doch mal nachfragen.

Wenn ich einen Thread habe, der eine "while not Terminated"-Schleife im Execute Teil abarbeitet und dann aus irgendeinen Grund, terminiert wird, kann man diesen Thread dann irgendwie wieder neustarten?
Die Thread-Instanz ist nach dem Terminate nicht NIL.

Kann man da einfach .Resume wieder ausführen oder ist dies nach einem Terminate-Event nicht mehr möglich?

Delphi-Quellcode:
procedure TMyThread.Execute;
begin
  FreeOnTerminate := False;

  while not Terminated do
  begin
    //Tue irgendwas...
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyThread := TMyThread.Create(False); //Execute sofort ausführen
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  MyThread.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyThread.Terminate;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  //MyThread.Resume;
  //Hier den Thread wieder starten (Execute wieder durchlaufen) obwohl vorher Terminiert
end;
Anbei bisschen Beispielcode.
MyThread ist global deklariert. Reihenfolge der Button Clicks wäre erst 1 dann 2.
Ist nur ein Beispiel und ohne sinnvollen Inhalt :-)

Gruß
Alex

Uwe Raabe 2. Okt 2012 15:19

AW: Thread nach Terminate wieder starten
 
Nein, das geht nicht - und sollte es doch gehen, würde ich es nicht empfehlen.

Bei einem Terminate wird die private Variable FTerminated auf true gesetzt und kann über protected property Terminated abgefragt werden. Es gibt aber keine Stelle, wo das FTerminated auf false gesetzt wird, außer implizit im constructor.

nuclearping 2. Okt 2012 15:23

AW: Thread nach Terminate wieder starten
 
Geht kein .Suspend?

Alex_ITA01 2. Okt 2012 15:27

AW: Thread nach Terminate wieder starten
 
Delphi-Quellcode:
procedure TThread.Terminate;
begin
  if FExternalThread then
    raise EThread.CreateRes(@SThreadExternalTerminate);
  FTerminated := True;
end;
@Uwe: Das habe ich auch grad beim lesen entdeckt...

@nuclearping: Angenommen er beendet sich aber nicht wie in meinem Beispiel durch den Aufruf von .Terminate sondern weil in der Execute-Methode ein "Fehler" drinne ist, dann beendet sich der Thread selbstständig an dieser Stelle. Ist nur ein Beispiel, deswegen würde Suspend nicht gehen.

Bevor jetzt große Unruhe aufkommt: Ich weiß, es sollte sowieso kein Fehler in der Execute Methode vorhanden sein aber vielleicht gibt es ja eine ganz ungünstige Situation die nur 1x pro Monat auftritt, welche dann wiederum zum Fehler führt. Ist wie gesagt nur ein Beispiel und darauf bezog sich meine Frage. Aber anscheind geht das wirklich nicht, schade...

Gruß
Alex

shmia 2. Okt 2012 15:37

AW: Thread nach Terminate wieder starten
 
Zitat:

Zitat von Alex_ITA01 (Beitrag 1185425)
und dann aus irgendeinen Grund, terminiert wird,

Und welcher Grund?

Delphi-Quellcode:
procedure TMyThread.InternalExecute;
begin
  while not Terminated do
  begin
    //Tue irgendwas...
  end;
end;

procedure TMyThread.Execute;
begin
  try
    InternalExecute;
  except
    // Exception innerhalb eines Threads abfangen und protokollieren
    on E:Exception do
    begin
      logger.LogError('TMyThread terminated with exception: '+E.Classname+','+E.Message);
    end;
  end;
end;

himitsu 2. Okt 2012 15:41

AW: Thread nach Terminate wieder starten
 
Am Einfachsten du gibst die alte Instanz frei und erstellst eine Neue, welche gestartet wird.

Wenn eine Exception auftrat, dann ist der Zustand diese TThread-Instanz (deren Felder/Variablen) eh nicht unbedingt in einem definierten Zustand, womit man da besser ganz neu anfangen sollte.


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