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;
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;
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.