Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Threads richtig beenden, wie? <<Solved>> (https://www.delphipraxis.net/71593-threads-richtig-beenden-wie-solved.html)

xxl1 17. Jun 2006 21:57


Threads richtig beenden, wie? <<Solved>>
 
Hallo zusammen,
ich möchte einen thread beenden den ich zuvor hiermit gestartet habe:
Delphi-Quellcode:
T:=TNetThread.create(false);
T.Resume;
der thread führt folgendes aus:
Delphi-Quellcode:
procedure TNetThread.Execute;
  begin
...
while not terminated do
Winsock_listen; //steht für die listen funktion von winsock
end;
beendet sollte er hiermit werden:
Delphi-Quellcode:
T.Suspend;
T.Terminate;
T.free;
Dies funktioniert allerdings nicht, der thread bleibt in der schleife hängen, auch wenn der benutzte socket mit
Delphi-Quellcode:
closesocket(s);
beendet wird.
Dieser wird auch tatsächlich geschlossen!
Bitte um hilfe. Danke schonmal an alle Hilfsbereiten!

markusj 17. Jun 2006 22:21

Re: Threads richtig beenden, wie?
 
Du musst das Terminate setzen,
Dann warten bis der Thread Terminiert ist.
Das Suspend ist dann meiner Meinung nach Überflüssig.

mfG

Markus

EDIT: Alternativ machst du FreeOnTerminate auf true und gibst dann das Temrinate-Kommando.

Dax 17. Jun 2006 22:33

Re: Threads richtig beenden, wie?
 
Ein Thread hat selbstständig mitzukriegen, wann er terminiert wird. Von daher ist ein .Suspend eher kontraproduktiv: es hält den Thread an. Lässt du es weg, läuft er weiter, kriegt nen Listen-Timeout und springt aus der While-Schleife raus. Wenn danach nix mehr kommt, killt sich der Thread.

gsh 17. Jun 2006 22:34

Re: Threads richtig beenden, wie?
 
Zitat:

Zitat von markusj
Das Suspend ist dann meiner Meinung nach Überflüssig.

Nein das ist nicht nur überflüssig sondern genau der Fehler da wenn du den Thread pausierst dann tut der ganz genau gar nichts also terminiert er sich auch nicht.

Aber in deinem Fall ist es wahrscheinlich besser so: (was markusj schon angeschnitten hat)
Delphi-Quellcode:
T:=TNetThread.create(false);
T.FreeOnTerminate := true;
T.Resume;
Dann brauchst du zum beenden nur noch:
Delphi-Quellcode:
T.Terminate;
Dann wird er nämlich automatisch freigegeben :wink:

//edit: Mist zu spät aber wo war die rote Box?

markusj 17. Jun 2006 22:36

Re: Threads richtig beenden, wie?
 
*hüstel*
Ich schreib SUSPEND! nicht RESUME ...
Wenn er den Thread einschläfert, kann der nicht merh reagieren ... SUSPEND = Einfschläfern ...

mfG

Markus

xxl1 18. Jun 2006 15:58

Re: Threads richtig beenden, wie?
 
Danke für die Hilfe!
Das
Delphi-Quellcode:
T.FreeOnTerminate := true;
hat geholfen


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