AGB  ·  Datenschutz  ·  Impressum  







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

Thread restart

Ein Thema von FAM · begonnen am 19. Feb 2015 · letzter Beitrag vom 20. Feb 2015
Antwort Antwort
FAM

Registriert seit: 22. Dez 2014
47 Beiträge
 
Delphi XE Enterprise
 
#1

Thread restart

  Alt 19. Feb 2015, 11:08
Delphi-Version: 5
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?
  Mit Zitat antworten Zitat
OlafSt

Registriert seit: 2. Mär 2007
Ort: Hamburg
284 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Thread restart

  Alt 19. Feb 2015, 11:23
- Stelle FreeOnTerminate des Threads auf true. Dadurch gibt er sich von selbst frei, wenn die 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 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: TEvent .
  Mit Zitat antworten Zitat
FAM

Registriert seit: 22. Dez 2014
47 Beiträge
 
Delphi XE Enterprise
 
#3

AW: Thread restart

  Alt 19. Feb 2015, 11:40
- Stelle FreeOnTerminate des Threads auf true. Dadurch gibt er sich von selbst frei, wenn die 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 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: 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
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#4

AW: Thread restart

  Alt 19. Feb 2015, 13:25
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.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#5

AW: Thread restart

  Alt 20. Feb 2015, 07:38
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.
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:24 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