Code: Alles auswählen
TTestClass= class
private
Core: TTBCore;
procedure ThreadStopped(Sender: TObject);
public
procedure ExecuteThread;
end;
{ TTestClass}
procedure TTestClass.ThreadStopped(Sender: TObject);
begin
if Sender=Core then
Core:=Nil;
Sender.Free;
end;
procedure TTestClass.ExecuteThread;
begin
Core:=TTBCore.Create(@ThreadStopped);
while Assigned(Core) and (not Core.Finished) do Sleep(200);
end;
Der Konstruktor und Destruktor des Threads sieht wie folgt aus:
Code: Alles auswählen
constructor TTBCore.Create(AOnTerminate: TNotifyEvent);
begin
FreeOnTerminate := False;
OnTerminate := AOnTerminate;
{$IfDef DEBUG}
CreateDebugLogger;
{$Else}
CreateFileLogger(SLogPath);
{$EndIf}
inherited Create(False);
end;
destructor TTBCore.Destroy;
begin
DestroyLogger;
inherited Destroy;
end;
Der einfachheit halber sei der Code der Execute Methode leer (dann tritt der Selbe fehler auf).
Nun obwohl nichts in der Execute ausgeführt wird, wird niemals OnTerminate aufgerufen, und somit auch nicht die Methode ThreadStopped die den Speicher wieder frei räumen soll. Die Frage die ich mir nun Stelle ist, warum nicht?
PS: Ich verwende ein einfaches Programm ohne Forms o.ä. unter Windows 10.
PPS: Wenn ich FreeOnTerminate auf True setze wird der Thread dennoch auch nicht gefreed.