Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Thread restart (https://www.delphipraxis.net/184009-thread-restart.html)

FAM 19. Feb 2015 10:08

Delphi-Version: 5

Thread restart
 
Hallo Zusammen,

ich würde gerne eine Thread (unter bestimmten Bedingungen) restarten

Delphi-Quellcode:

  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
das scheint mir aber nicht wirklich gut zu sein, hat jemand eine andere Idee?

OlafSt 19. Feb 2015 10:23

AW: Thread restart
 
- Stelle
Delphi-Quellcode:
FreeOnTerminate
des Threads auf true. Dadurch gibt er sich von selbst frei, wenn die
Delphi-Quellcode:
Execute
-Methode verlassen wird.
- Wenn du den Thread erneut brauchst, erstelle ihn einfach neu.

Threads sind nur so lange "am Leben", wie sie in der
Delphi-Quellcode:
Execute
-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:
Delphi-Quellcode:
TEvent
.

FAM 19. Feb 2015 10:40

AW: Thread restart
 
Zitat:

Zitat von OlafSt (Beitrag 1290569)
- Stelle
Delphi-Quellcode:
FreeOnTerminate
des Threads auf true. Dadurch gibt er sich von selbst frei, wenn die
Delphi-Quellcode:
Execute
-Methode verlassen wird.
- Wenn du den Thread erneut brauchst, erstelle ihn einfach neu.

Threads sind nur so lange "am Leben", wie sie in der
Delphi-Quellcode:
Execute
-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:
Delphi-Quellcode:
TEvent
.

habe vergessen zu sagen das ich mit

Delphi-Quellcode:
  while not terminated do
  begin
    EventWait.WaitFor(2000);
end;
im Thread arbeite...

das ist ja auch genau das problem, ich möchte diese schleife beenden und dann neu starten

Blup 19. Feb 2015 12:25

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.

Dejan Vu 20. Feb 2015 06:38

AW: Thread restart
 
Lass doch deinen Code fast einfach, wie er ist:
Delphi-Quellcode:
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);
...
(Ungetestet, nur hingetippt)

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 Workerthread-Poolanschauen. Dort wird das Konzept eines Threads etwas anders behandelt. Vielleicht ist das was.


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