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.