Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Thread nach Suspend neustarten lassen (https://www.delphipraxis.net/89376-thread-nach-suspend-neustarten-lassen.html)

Manzoni 30. Mär 2007 09:54


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:
procedure TMonitor.Resume;
begin
  self.Suspended:=false;
  Execute;
end;
Ist das eine praktikable Lösung?

SirThornberry 30. Mär 2007 09:58

Re: Thread nach Suspend neustarten lassen
 
das geht so gar nicht.
durch
Delphi-Quellcode:
suspendet := False;
läuft der Thread weiter und durch
Delphi-Quellcode:
Execute();
wird die Execute-Methode im Context des aufrufers ausgeführt.

Dein Thread läuft also weiter und die Execute-Methode läuft in deinem hauptthread.

Manzoni 30. Mär 2007 10:15

Re: Thread nach Suspend neustarten lassen
 
Okay, das hab ich auch grad gemerkt :oops:

Weißt du eine Möglichkeit das zu realisieren?

gsh 30. Mär 2007 10:20

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.

Manzoni 30. Mär 2007 10:59

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

SirThornberry 30. Mär 2007 11:46

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:
Thread.NeedRestart := True;
Thread.Resume;
Du musst also einfach nur dafür sorgen das er wieder ein dem Quelltext des Begins der Execute-Methode vorbei kommt.

Manzoni 30. Mär 2007 12:53

Re: Thread nach Suspend neustarten lassen
 
Okay! Danke Dir! So ähnlich habe ich es jetzt auch gelöst...

alzaimar 30. Mär 2007 13:32

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:
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;
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...


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