Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Thread vorzeitig beenden (https://www.delphipraxis.net/151570-thread-vorzeitig-beenden.html)

DarkItachi 23. Mai 2010 15:08


Thread vorzeitig beenden
 
Gutentag,

Ich möchte mein Thread gerne beenden können, d.h. die Operation vorzeitig abbrechen können.
Dabei hat mein Thread die Funktion in TMyThrd.Execute
Delphi-Quellcode:
[...]
begin
   For I:= 1 to param1 do begin //param1 kann manchmal über 100.000 sein, deswegen soll man das abbrechen können
     [...]
   end;
 Destroy; //Wenn fertig, dann wird abgebrochen
end;
Ich habe es bereits versucht mit, while not terminated do begin
aber es nützt nichts.
Der Thread arbeitet immer weiter bis er fertig ist.

Auch wenn man die Anwendung beendet, erhält man ein Systemfehler(wenn Thread noch nicht fertig)

Hat jemand eine Idee?

himitsu 23. Mai 2010 15:16

Re: Thread vorzeitig beenden
 
.Terminate setzt nur ein Bit, welches der Programmierer auswerten muß.
(dieses wird auch in jedem guten Thread-Tutorial gezeigt)
Delphi-Quellcode:
// in Execute
begin
  while not Terminated do begin
    [...]
  end;
end;
In deinem Fall also:
Delphi-Quellcode:
begin
  FreeOnTerminate := True; // statt Destroy
  For I := 1 to param1 do begin
    if Terminated then Break;
    [...]
  end;
end;
Zitat:

Ich habe es bereits versucht mit, while not terminated do begin
Und wie hattest du das versucht?


Destroy ruft man nicht direkt auf.
Dafür gibt es Free und ein Objekt löschen, wärend dieses verwendet wird, ist ebenfalls Unklug.
PS: Nach dem Ende von Execute wird noch einiges im Thread erledigt, demnach würdest du mit Destroy dem Threrad sein Objekt (sich selber) unterm Arsch weglöschen, was welches gut enden kann.

jaenicke 23. Mai 2010 15:51

Re: Thread vorzeitig beenden
 
Zitat:

Zitat von DarkItachi
Ich habe es bereits versucht mit, while not terminated do begin
aber es nützt nichts.
Der Thread arbeitet immer weiter bis er fertig ist.

Mal ganz dumm gefragt: :stupid:
Hast du denn DeinThread.Terminate; aufgerufen?
Wahrscheinlich hast du das gemacht, aber es hört sich genau danach an als hättest du das nicht gemacht, deshalb frage ich lieber mal. ;-)

DarkItachi 23. Mai 2010 18:07

Re: Thread vorzeitig beenden
 
Danke an alle..
@Jaenicke--> Ja klar, habe ich! ^^ Hätte ich im thread schreiben sollen! lol :thumb:

Gute Idee mit Break;

Thx

jaenicke 23. Mai 2010 19:16

Re: Thread vorzeitig beenden
 
Dann muss es aber auch mit der while Schleife gehen. Vorausgesetzt die einzelnen Durchläufe dauern nicht zu lange.

Ah, Moment... du hast das doch nicht so gemeint?
Delphi-Quellcode:
while not Terminated do
  for i := 1 to param1 do
  begin
    ...
So geht es jedenfalls sicher:
Delphi-Quellcode:
i := 1;
while not Terminated do
begin
  ...
  Inc(i);
end;
Aber hier ist for + Break natürlich auch passend.

himitsu 23. Mai 2010 19:28

Re: Thread vorzeitig beenden
 
Zitat:

Zitat von jaenicke
So geht es jedenfalls sicher:

@jaenicke: Du meinst es bestimmt so?
Delphi-Quellcode:
i := 1;
while (i <= param1) and not Terminated do
begin
  ...
  Inc(i);
end;
(die andere Abbruchbedingung nicht vergessen)

jaenicke 23. Mai 2010 19:30

Re: Thread vorzeitig beenden
 
Man kann ja mal was vergessen. :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 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