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
Seite 1 von 2  1 2      
gkoeder

Registriert seit: 15. Jun 2004
84 Beiträge
 
Delphi 2010 Professional
 
#1

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

  Alt 25. Aug 2005, 22:34
Hallo!

Ich beschäftige mich derzeit ein bisserl mit Threads und hab' da ein kleines Verständnisproblem:

Wenn ich einen Thread starte, führt diese die Prozedur 'Execute' aus. Sobald der Thread mit seiner Arbeit fertig ist (... die Execute-Prozedur durchlaufen ist), setze ich den Thread in den Suspended-State (Er pausiert also). Wenn ich nun den Thread mit Resume wieder zum Leben erwecke, wo fährt der Thread mit seiner arbeit fort? Startet er erneut die Execute-Prozedur oder arbeitet er einfach die nächste Zeile ab, wo ich ihn zuvor pausiert habe?

Greetings
Gerald
  Mit Zitat antworten Zitat
Benutzerbild von FastJack2
FastJack2

Registriert seit: 22. Mär 2004
Ort: Lübeck
54 Beiträge
 
Delphi 7 Enterprise
 
#2

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

  Alt 25. Aug 2005, 22:54
Er macht genau da weiter, wo du ihn suspended hast...
aber das lässt sich leicht hiermit herausfinden:

Code:
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;
greetz
-FastJack2
wo unrecht zu recht wird, wird widerstand zur pflicht ! (c) '98 - WoF board
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#3

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

  Alt 25. Aug 2005, 23:45
Zitat von gkoeder:
Wenn ich einen Thread starte, führt diese die Prozedur 'Execute' aus. Sobald der Thread mit seiner Arbeit fertig ist (... die Execute-Prozedur durchlaufen ist), setze ich den Thread in den Suspended-State (Er pausiert also). Wenn ich nun den Thread mit Resume wieder zum Leben erwecke, wo fährt der Thread mit seiner arbeit fort? Startet er erneut die Execute-Prozedur oder arbeitet er einfach die nächste Zeile ab, wo ich ihn zuvor pausiert habe?
Einen Thread benutzt man immer nur für wiederkehrende und/oder zyklische Probleme (Iterationen zB). Daher ist deine Execute-Methode ja üblicherweise eine Schleife. Wenn der Thread sich selber schlafenlegt, kannst du auch selber bestimmen, an welcher Stelle dies geschieht. Danach fährt er direkt hinter der Suspend-Anweisung fort.

Legst du den Thread von außen schlafen, kann man nicht sagen, wo er angehalten wird. Es kann zB mitten innerhalb einer Anweisung (auf HLL-Ebene) geschehen ... zB während ein Parameter bereits auf dem Stack liegt, der nächste aber noch nicht. Man kann es also nicht voraussagen, kann aber den Threadkontext holen und auch setzen (Rechte vorausgesetzt), wo unter anderen die aktuelle Adresse des EIP (Instruction Pointer) drinsteht.
  Mit Zitat antworten Zitat
Benutzerbild von BlackJack
BlackJack

Registriert seit: 2. Jul 2005
Ort: Coesfeld
246 Beiträge
 
Delphi 2005 Personal
 
#4

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

  Alt 26. Aug 2005, 02:21
ich habe das so verstanden dass er den thread wieder starten will nachdem die Execute-procedure abgearbeitet und schon wieder verlassen worden ist.
ich weiss allerdings gerade nicht ob man einen Thread, der mit der Execute-Methode fertig ist (und bei dem FreeOnTerminate auf False steht) so einfach mit Resume wieder von vorne starten kann (ich denke mal das wird nämlich der Threadersteller vorhaben).

edit: für dieses Vorhaben wäre auch das Event OnTerminate ganz nützlich.
See my shadow changing, stretching up and over me.
Soften this old armor. Hoping I can clear the way
By stepping through my shadow, coming out the other side.
Step into the shadow. Forty six and two are just ahead of me.
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#5

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

  Alt 26. Aug 2005, 06:28
Wenn ich mal davon ausgehen darf, das es hier um eine beendete Execute-Prozedur geht, dann will ich hiermit dringlichst davon abraten, diese wieder per "Execute"-Aufruf zu starten. Dann verhält sie sich nämlich wie eine Prozedur und der ganze Vorteil eines Threads ist weg. Ich für meinen Teil mache das dann immer so:

Delphi-Quellcode:
procedure TThread.Execute();
begin
  while not Self.Suspended do
  begin
    //Machwas;
  end;
end;
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
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, 07: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
Olli
(Gast)

n/a Beiträge
 
#7

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

  Alt 26. Aug 2005, 10:50
Zitat von BlackJack:
ich habe das so verstanden dass er den thread wieder starten will nachdem die Execute-procedure abgearbeitet und schon wieder verlassen worden ist.
Das geht nunmal nicht mit einem Thread. Ob der TThread das irgendwie kapselt um es zum Laufen zu bringen, weiß ich nicht.

Zitat von BlackJack:
ich weiss allerdings gerade nicht ob man einen Thread, der mit der Execute-Methode fertig ist (und bei dem FreeOnTerminate auf False steht) so einfach mit Resume wieder von vorne starten kann (ich denke mal das wird nämlich der Threadersteller vorhaben).
Schwerlich, wenn man auf freigegebenen Speicher verweist

Zitat von BlackJack:
edit: für dieses Vorhaben wäre auch das Event OnTerminate ganz nützlich.
Warum nicht einfach einen Thread zweckgemäß verwenden statt seine eigenen Vorstellungen um jeden Willen durchzusetzen? ... die Fensterschleife wird auch nicht serieller, nur weil man sie nicht als Schleife haben will ...

Zitat von chaosben:
Wenn ich mal davon ausgehen darf, das es hier um eine beendete Execute-Prozedur geht, dann will ich hiermit dringlichst davon abraten, diese wieder per "Execute"-Aufruf zu starten.
so ist es ...

Zitat von chaosben:
Delphi-Quellcode:
procedure TThread.Execute();
begin
  while not Self.Suspended do
  begin
    //Machwas;
  end;
end;
Ich benutze zwar kein TThread, würde es aber so machen:
Delphi-Quellcode:
procedure TThread.Execute();
begin
  while not Terminated do
  begin
    //Machwas;
    Suspend(); // Am Ende der Schleife schlafenlegen ...
  end;
end;
... wie oben beschrieben. So kann man garantieren, daß erst ein Schleifendurchlauf durch ist, bevor man wieder neu beginnt (durch Resume von außen). Außerdem sollte die Suspended-Property nur von außen Sinn machen, da Execute ja nicht ausgeführt wird und damit auch nicht die Prüfung ob Suspended oder nicht. Man könnte es also genausogut durch ein while(true)do; ersetzen

Zitat von Bitmap:
Wenn nun von aussen die Methode suspend aufgerufen wird, hält der Thread genau an der Zeile an, wo er gerade war.
Bei Hochsprachen (HLLs) kann man das so nicht sagen, da eine Zeile meistens vielen Assemblermnemonics entspricht.

Zitat von Bitmap:
Im obigen Fall wird das mit 99.99% Wahrscheinlichkeit bei der Zeile sleep(500) der Fall sein.
Genauer: davor oder dahinter, weil Sleep dem Scheduler sagt, daß dieser Thread soundsolange keine Zeit aus der Zeitscheibe zugeteilt bekommen soll. Damit wird der Thread sozusagen hinten in die Warteschlange gestellt. Dies ist auch bei Sleep(0) der Fall, welches nur die komplette Rechenzeit des Threads an den nächsten Thread der Zeitscheibe abgibt - aber auch beim nächsten Durchlauf wieder diesen Thread drannimmt.

Zitat von Bitmap:
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.
Daher würde ich FreeonTerminate außerhalb der Schleife in der Execute-Methode aufrufen. Damit kann man alle Vorteile daraus ziehen, hat aber keine Nachteile.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

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

  Alt 26. Aug 2005, 11:05
Zitat von Olli:
Daher würde ich FreeonTerminate außerhalb der Schleife in der Execute-Methode aufrufen. Damit kann man alle Vorteile daraus ziehen, hat aber keine Nachteile.
FreeOnTerminate ist keine Methode zum Aufrufen, sondern eine Eigenschaft, die entweder True oder False sein kann.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#9

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

  Alt 26. Aug 2005, 11:31
Zitat von Luckie:
FreeOnTerminate ist keine Methode zum Aufrufen, sondern eine Eigenschaft, die entweder True oder False sein kann.
Das ist mir schon klar. Dann rufst du eben "FreeOnTerminate := True" auf ... ich dachte ich sei pedantisch
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

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

  Alt 26. Aug 2005, 11:33
Normalerweiser erzeugt man das Thread-Objekt um angahltenen Zustand, setzt dann die Eigenschaften, unteranderem eben auch FreeOnTerminate, und ruft dann die Methode Resume auf.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:51 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