Einzelnen Beitrag anzeigen

Bitmap

Registriert seit: 25. Aug 2005
Ort: Arth
10 Beiträge
 
Delphi 7 Professional
 
#6

Re: Threads Suspend -> Resume ... wo gehts weiter?

  Alt 26. Aug 2005, 06:35
Meiner Meinung nach macht ein Thread nur Sinn, wenn Du eine wiederholende Arbeit damit ausführst, sonnst kann man nämlich eine normales Objekt mit Methode für die Verarbeitung verwenden. Ich gehe mal davon aus dass Du auf einer Maschine mit nur einem Prozessor arbeitets, also eigentlich sowieso alles sequentiell abläuft.
Dann sollte eine Execute Methode so aussehen:
Delphi-Quellcode:
procedure TMeinThread.execute;
var
  i: integer;
begin
  while not terminated do
  begin
    form1.Memo1.Lines.Add(inttostr(i));
    i := i + 1;
    sleep(500);
  end;
end;
Von der logik her wird das System die While .. do Schleife solange durchlaufen, bis die Bedingung termineted auf true gesetzt wird.
Wenn nun von aussen die Methode suspend aufgerufen wird, hält der Thread genau an der Zeile an, wo er gerade war. Im obigen Fall wird das mit 99.99% Wahrscheinlichkeit bei der Zeile sleep(500) der Fall sein.
Falls Du an einer bestimmten stelle immer anhalten möchtest kannst Du Dir einfach folgendes Hilfskonstrukt in die execute Methode einbauen:

Delphi-Quellcode:
[b]procedure TMeinThread.SetSuspend;

begin
SuspendRequested:=true;
end;[/b]

procedure TMeinThread.execute;
var
  i: integer;
begin
  while not terminated do
  begin
    [b]form1.Memo1.Lines.Add(inttostr(i));[/b]
    if SuspendRequested then suspend;
    i := i + 1;
    sleep(500);
  end;
end;
Bei der Anweisung Terminate musst Du ebenfalls beachten, dass der Thread nicht sofort beendet wird, sondern lediglich das Property Termineted auf True gesetz wird. Somit läuft die Execute Methode nochmal bis zum Ende durch. Könnte unerwünschte Nebeneffekte haben.
Wenn Du FreeonTerminate auf True setzt um alles nachher aufgeräumt zu haben, solltest Du beachten, dass Threads die suspended sind niemals freigegeben werden, da die execute methode nicht zu ende laufen kann.
Dies müsstest Du ebenfalls selber ausprogrammieren, indem Du bei Terminate einen suspendeten Tread zuerst wieder resumest, damit er zuende laufen kann. Achtung bei verschachtelten Suspends, diese müssen ALLE wieder mit resume aufgehoben werden.

Hoffe das hilft Dir ein Bisschen weiter.

Viele Grüsse
Alex
  Mit Zitat antworten Zitat