![]() |
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:
Anbei bisschen Beispielcode.
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; MyThread ist global deklariert. Reihenfolge der Button Clicks wäre erst 1 dann 2. Ist nur ein Beispiel und ohne sinnvollen Inhalt :-) Gruß Alex |
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. |
AW: Thread nach Terminate wieder starten
Geht kein .Suspend?
|
AW: Thread nach Terminate wieder starten
Delphi-Quellcode:
@Uwe: Das habe ich auch grad beim lesen entdeckt...
procedure TThread.Terminate;
begin if FExternalThread then raise EThread.CreateRes(@SThreadExternalTerminate); FTerminated := True; end; @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 |
AW: Thread nach Terminate wieder starten
Zitat:
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; |
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 17:42 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