Nach ein bisschen Umbau und der Nutzung nur jener Klasse, die wirklich nötig ist, sieht es nun so aus:
Delphi-Quellcode:
type
TPingThread = class(TThread)
private
FClient: TClient;
FOnPingDone: TNotifyEvent;
protected
procedure Execute; override;
public
constructor Create(const AHost: string);
destructor Destroy; override;
property OnPingDone: TNotifyEvent read FOnPingDone write FOnPingDone;
property ReturnValue;
end;
implementation
constructor TPingThread.Create(const AHost: string);
begin
FOnPingDone:= nil;
FreeOnTerminate:= True;
FClient:= TClient.Create(AHost);
FClient.Port:= 80;
inherited Create(False);
end;
destructor TPingThread.Destroy;
begin
FClient.Free;
inherited;
end;
procedure TPingThread.Execute;
begin
if Assigned(FClient) then
ReturnValue:= Integer(FClient.IsAlive);
if Assigned(FOnPingDone) then
FOnPingDone(Self);
end;
und in TfmMain weise ich das OnPingDone-Event statt OnTerminate zu. Das Speicherleck beim vorzeitigen Beenden ist etwas kleiner:
Code:
---------------------------
Unexpected Memory Leak
---------------------------
An unexpected memory leak has occurred. The unexpected small block leaks are:
1 - 12 bytes: TObject x 1
21 - 28 bytes: AnsiString x 1
61 - 68 bytes: Unknown x 1
69 - 76 bytes: TPingThread x 1
93 - 100 bytes: TClient x 1
---------------------------
OK
---------------------------
Kann man dagegen noch etwas tun? Ist zwar nicht besonders groß, aber stören tut's mich schon, und normalerweise räume ich den Krempel wieder auf, den ich erzeuge.
Grüße
Dalai