![]() |
Thread abbrechen
Wie kann ich den Thread abbrechen?
Ich habe es schon mit .Suspend versucht und auch mit einer Variable, aber das funktioniert nicht:
Delphi-Quellcode:
Und "Bla" würde dann bei Execute aufgerufen werden...
procedure Kill;
begin Thread.FKill := true; Thread.Suspend; end; procedure TThread.Bla; begin while (not FKill) or (not Suspended) do begin ... end; end; |
Re: Thread abbrechen
Delphi-Quellcode:
Hängt sich nicht aber das Programm durch TThread.Bla auf, wenn darin eine Schleife ausgeführt wird?
procedure Kill;
begin Thread.Terminate; end; procedure TThread.Bla; begin while not Terminated do begin ... end; end; |
Re: Thread abbrechen
Ne ^^ Deshalb ist es ja ein Thread und dient nur zum Neuzeichnen ;)
Aber Terminate wäre unpraktisch, weil ich ihn wieder starten ".Resume" möchte. |
Re: Thread abbrechen
OMFG... Entschuldigung für diesen Ausdruck, aber das war einfach nur... öhm... Dummheit :wall: :oops:
Es ist logisch, dass er nich abbricht, weil das Codebeispiel oben nicht ganz richtig ist! Und zwar musste es heißen:
Delphi-Quellcode:
Aber dennoch habe ich die Frage, wie man nach "Suspend", den Thread wieder anschmeißen kann...
while FActive do
begin ... for ... begin if FKill then break; <!--- 1. Fehler, er verlässt nur die Schleife end; end; FActive := true <!--- 2. Fehler: Active ist nicht der zustand einer Checkbox Wenn das mit Resume geht, dann wäre es nett es zu posten, weil er das nicht tut... |
Re: Thread abbrechen
Tja, eigentlich sollte es mit resume gehen. Hast du ihn zufällig mehrfach suspended? Dann musst du ihn auch genauso oft resumen.
|
Re: Thread abbrechen
Es geht schon mit Resume; nur natürlich nicht ausm Thread heraus, weil der ja suspended ist. Btw. ist es imho sinnlos, im thread zu prüfen, ob es suspended ist - das sollte immer false geben ;)
|
Re: Thread abbrechen
Zitat:
|
Re: Thread abbrechen
1. Execute ruft "Bla" auf
2. Mit Resume scheints irgendwie nicht zu funktionieren... Aber vielleicht liegt es auch an den Threadcode... Ich werde den morgen mal onlinestellen! |
Re: Thread abbrechen
Hi,
Du kannst den Thread sich nicht selbst Resumen lassen, da er ja Suspended ist und somit keine Code ausführt,das heist du musst den Thread aus einem anderen Thread Resumen. z.B. so:
Delphi-Quellcode:
Suspenden scheint ja zu klappen aber trotzdem nochmal:
if Thread.Suspended then // nicht im Kontext von "Thread"
begin Thread.Resume end;
Delphi-Quellcode:
Beim Suspenden und Resumen solltes du aber sicherstellen, dass der Thread auch noch ausgeführt wird, da du sonst eine Exception bekommst.
if not Thread.Suspended then // kann im Kontext von Thread sein wobei du dir dann die Abfrage sparen kanst
begin Thread.Suspend; end; |
Re: Thread abbrechen
Liste der Anhänge anzeigen (Anzahl: 1)
Also ich glaube es ist hier ein bisschen Unverständnis. Aufgrund dessen stelle ich den Code schon mal online.
|
Re: Thread abbrechen
Deine SetActive-Methode ist nicht ganz richtig. Du suspendest oder resumest, aber wenn der Thread vorher schon suspendet war, muss danach zweimal resume verwendet werden, genauso reicht einmal resume nicht aus, wenn zweimal suspendet war.
Schau dir mal die Eigenschaft suspended an. Ist es Absicht, dass am Anfang von TMiamiLabel gleich zweimal suspended (wenn csDesigning in ComponentState) wird? Du createst ja suspended und setzt dann nochmal setActive. Hoffe geholfen zu haben Apollonius |
Re: Thread abbrechen
Okay... ich habe das jetzt folgenermaßen umprogrammiert:
Delphi-Quellcode:
Aber er stoppt nicht mehr...
procedure TMiamiLabelMoving.DrawLoop;
begin {...} if not FActive then begin if FKill then begin FKill := false; FActive := false; end; Suspend; end; end; procedure TMiamiLabel.SetActive(const Value: Boolean); begin FActive := Value; MovingThread.FActive := Value; if (Value) and (MovingThread.Suspended) then MovingThread.Resume; end; |
Re: Thread abbrechen
So war das nicht gemeint.
Delphi-Quellcode:
procedure TMiamiLabel.SetActive(const Value: Boolean);
begin FActive := Value; MovingThread.FActive := Value; Movingthread.suspended:=value; end; |
Re: Thread abbrechen
Achso... Aber das wollte ich nicht ;) und zwar sollte er schon die Animation fertig gemacht haben und dann suspenden ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz