Ein Problem sehe ich hier im Destructor
Delphi-Quellcode:
destructor TD2007Thread.Destroy;
begin
if (FThreadID <> 0) and not FFinished then
begin
Terminate;
if FCreateSuspended then
Resume;
WaitFor; // Diese Stelle ist problematisch
end;
Das Problem kann hier auftauchen:
Delphi-Quellcode:
var
LThread : TThread;
begin
LThread.Create( True );
LThread.Free;
end;
Denn nun wird zwar im Destructor korrekterweise das
TThread.Resume aufgerufen, allerdings dauert es eine geraume Zeit bis der Thread
wirklich losläuft und somit auch
TThread.WaitFor eine Chance hat darauf zu warten bis der Thread wirklich wieder beendet ist. Hier kann es also passieren, dass nun nicht gewartet wird, der Destructor weiter ausgeführt wird und irgendwann der Thread eigentlich erst losläuft.
In neueren Delphi-Versionen wird genau nach dem
Resume
noch in Kombination mit
TThread.Yield (ab XE) gewartet bis der Thread auch wirklich angelaufen ist.
Delphi-Quellcode:
if FCreateSuspended or FSuspended then
Resume;
while not FStarted do
Yield;
WaitFor;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)