![]() |
Thread nach Suspend neustarten lassen
Hallo!
In einem Dienst von mir unterbreche ich einen Thread mit Thread.Suspend. Wenn ich den Thread jetzt mit Thread.Resume weiterlaufen lassen will, wird die Execute Methode verständlicherweise nicht neugestartet sondern dort fortgesetzt, wo ich den Thread unterbrochen habe. Wie kann ich aber erreichen, dass Execute von vorne neu durchlaufen wird, wenn ich den Thread fortsetze? Ich habe die Methode Resume einfach wie folgt überschrieben:
Delphi-Quellcode:
Ist das eine praktikable Lösung?
procedure TMonitor.Resume;
begin self.Suspended:=false; Execute; end; |
Re: Thread nach Suspend neustarten lassen
das geht so gar nicht.
durch
Delphi-Quellcode:
läuft der Thread weiter und durch
suspendet := False;
Delphi-Quellcode:
wird die Execute-Methode im Context des aufrufers ausgeführt.
Execute();
Dein Thread läuft also weiter und die Execute-Methode läuft in deinem hauptthread. |
Re: Thread nach Suspend neustarten lassen
Okay, das hab ich auch grad gemerkt :oops:
Weißt du eine Möglichkeit das zu realisieren? |
Re: Thread nach Suspend neustarten lassen
Ich würde sagen du musst deinen Thread terminieren (am besten dann mit FreeOnTerminate freigeben) dann neu erzeugen und dann wieder starten.
Weil wenn du deinen Thread einfach mitten drinnen abbrichst und zum anfangen springen lässt dann könnte des zu speicherleaks und fehler führen. |
Re: Thread nach Suspend neustarten lassen
Okay, danke für die schnelle Antwort. Dachte es geht auch anders, aber dann werde ich es so machen!
LG Manzoni |
Re: Thread nach Suspend neustarten lassen
du musst es so machen wie bei allem anderen auch (unabhängig ob thrad oder nicht)
Delphi-Quellcode:
procedure TYourThread.Execute();
begin while not(Terminated) do begin //Thread Start-Code needrestart := False; while not(needrestart) and not(Terminated) do begin //dein zeugs end; end; end;
Delphi-Quellcode:
Du musst also einfach nur dafür sorgen das er wieder ein dem Quelltext des Begins der Execute-Methode vorbei kommt.
Thread.NeedRestart := True;
Thread.Resume; |
Re: Thread nach Suspend neustarten lassen
Okay! Danke Dir! So ähnlich habe ich es jetzt auch gelöst...
|
Re: Thread nach Suspend neustarten lassen
Ich halte es für keine gute Idee, einen Thread mit Suspend/Resume zu stoppen / starten, denn man weiss ja gar nicht, was er gerade macht.
Ich mache das immer mit Semaphoren / Events:
Delphi-Quellcode:
Wenn ich nun die Semaphore auf 0 setze, dann wird erstmal der Task beendet (was ja eterministisch ist) und der Thread wartet genau da, wo ich ihn haben will...
Procedure TMyThread.Execute;
Begin While Not Terminated do Case WaitForsingleObject (MySempahore, INFINITE) of WAIT_OBJECT_0 : _ExecuteTask; WAIT_ABANDONED : Terminated := True; WAIT_TIMEOUT:; End; End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:17 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 by Thomas Breitkreuz