AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Threads Suspend -> Resume ... wo gehts weiter?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von gkoeder · begonnen am 25. Aug 2005 · letzter Beitrag vom 26. Aug 2005
Antwort Antwort
Bitmap

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

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
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 21:27 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