Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Thread abbrechen (https://www.delphipraxis.net/92092-thread-abbrechen.html)

xZise 14. Mai 2007 14:09


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:
procedure Kill;
begin
  Thread.FKill := true;
  Thread.Suspend;
end;

procedure TThread.Bla;
begin
  while (not FKill) or (not Suspended) do
  begin
    ...
  end;
end;
Und "Bla" würde dann bei Execute aufgerufen werden...

richie 14. Mai 2007 14:16

Re: Thread abbrechen
 
Delphi-Quellcode:
procedure Kill;
begin
  Thread.Terminate;
end;

procedure TThread.Bla;
begin
  while not Terminated do
  begin
    ...
  end;
end;
Hängt sich nicht aber das Programm durch TThread.Bla auf, wenn darin eine Schleife ausgeführt wird?

xZise 14. Mai 2007 18:16

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.

xZise 14. Mai 2007 18:56

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:
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
Aber dennoch habe ich die Frage, wie man nach "Suspend", den Thread wieder anschmeißen kann...
Wenn das mit Resume geht, dann wäre es nett es zu posten, weil er das nicht tut...

Apollonius 14. Mai 2007 19:27

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.

jfheins 14. Mai 2007 19:28

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 ;)

richie 14. Mai 2007 20:35

Re: Thread abbrechen
 
Zitat:

Zitat von xZise
Deshalb ist es ja ein Thread

Aber wird nicht nur TThread.Execute als eigenständiger Thread ausgeführt? Das Programm müsste bei Bla doch hängen bleiben? Mich irritiert die while-Schleife :|

xZise 14. Mai 2007 22:09

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!

C.Schoch 14. Mai 2007 22:36

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:
if Thread.Suspended then // nicht im Kontext von "Thread"
begin
  Thread.Resume
end;
Suspenden scheint ja zu klappen aber trotzdem nochmal:
Delphi-Quellcode:
if not Thread.Suspended then // kann im Kontext von Thread sein wobei du dir dann die Abfrage sparen kanst
begin
 Thread.Suspend;
end;
Beim Suspenden und Resumen solltes du aber sicherstellen, dass der Thread auch noch ausgeführt wird, da du sonst eine Exception bekommst.

xZise 15. Mai 2007 13:51

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.

Apollonius 15. Mai 2007 14:11

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

xZise 15. Mai 2007 14:54

Re: Thread abbrechen
 
Okay... ich habe das jetzt folgenermaßen umprogrammiert:
Delphi-Quellcode:
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;
Aber er stoppt nicht mehr...

Apollonius 15. Mai 2007 15:09

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;

xZise 15. Mai 2007 18:08

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