![]() |
Delphi-Version: 5
Thread restart
Hallo Zusammen,
ich würde gerne eine Thread (unter bestimmten Bedingungen) restarten
Delphi-Quellcode:
das scheint mir aber nicht wirklich gut zu sein, hat jemand eine andere Idee?ThreadHandle: TThread; function RestartThread(const RefID: Integer; const Hostname: AnsiString; Callback: TPingCallback): Boolean; begin if Assigned(ThreadHandle) then begin ThreadHandle.Terminate; end; ThreadHandle := TRedundancyHostThread.Create(RefID, Hostname, Callback, Timeout); end |
AW: Thread restart
- Stelle
Delphi-Quellcode:
des Threads auf true. Dadurch gibt er sich von selbst frei, wenn die
FreeOnTerminate
Delphi-Quellcode:
-Methode verlassen wird.
Execute
- Wenn du den Thread erneut brauchst, erstelle ihn einfach neu. Threads sind nur so lange "am Leben", wie sie in der
Delphi-Quellcode:
-Methode sind - darum ist diese meist auch eine Endlossschleife. Will man nicht ständig Threads löschen und neu erstellen, muß man verhindern, das Execute verlassen wird. Dafür gibts etliche Möglichkeiten, von denen eine zu deinem Problem paßt:
Execute
Delphi-Quellcode:
.
TEvent
|
AW: Thread restart
Zitat:
Delphi-Quellcode:
im Thread arbeite...
while not terminated do
begin EventWait.WaitFor(2000); end; das ist ja auch genau das problem, ich möchte diese schleife beenden und dann neu starten |
AW: Thread restart
Der Thread als solches ist nach dem Verlassen der Execute-Methode bereits zerstört.
Nur das Objekt, das den Thread gekapselt hat, existiert noch. Das Neuerzeugen des Objekts kostet eigentlich fast keine Zeit. Warum sollte man das alte Objekt dann wiederverwenden? Das Neuerzeugen des Threads kann etwas Zeit benötigen, aber wir sprechen hier wahrscheinlich von weniger als einer Millisekunde. Vieleicht interessiert dich in dem Zusammenhang das Konzept eines Threadpools. Man erzeugt nicht mehr den Thread sondern die auszuführende Aufgabe als Klasse. Diese übergibt man an den Threadpool zur Ausführung. Ist die Aufgabe abgearbeitet, kann man diese danach erneut an den Threadpool übergeben. |
AW: Thread restart
Lass doch deinen Code fast einfach, wie er ist:
Delphi-Quellcode:
(Ungetestet, nur hingetippt)
Procedure TMyThread.Execute;
Begin while not terminated do case TriggerEvent.WaitFor(-1) of wrSignaled : ExecuteTheAction(); wrTimeout, wrAbandoned : Terminate; wrError : { Fehler loggen }; end; end; procedure TMyThread.RestartExecution; Begin TriggerEvent.SetEvent; end; Constructor TMyThread.Create; Begin ... TriggerEVent := .Create(nil, True, False, nil); ... Erzeuge den Thread. Er macht erst einmal nichts, sondern wartet, bis Du 'RestartExecution' aufgerufen hast. Dann erledigt er seine Aufgabe und legt sich wieder schlafen. Alternativ kannst Du dir mal den ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:19 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