Weil Terminate wird von TThread selber ja nie aufgerufen, sondern nur von außen.
Leider doch:
Delphi-Quellcode:
destructor TThread.Destroy;
begin
if not FFinished and not Suspended then
begin
Terminate; // <===
WaitFor;
end;
if FHandle <> 0 then CloseHandle(FHandle);
inherited Destroy;
RemoveThread;
end;
Der Aufruf in DoTerminate ist sicher falsch, weil zu spät im Ablauf.
Aber da Terminate nicht virtuell ist, kann man sich nicht drauf verlassen dass die Methode aufgerufen wird.
Delphi-Quellcode:
var
test : TThread;
begin
test := TMyThread.Create(False);
test.free; // Thread bleibt "hängen"
Ich habe jetzt die Vorschläge umgesetzt, den Destruktor angepasst und den Timeout auf 20s gesetzt.