Sorry, falls der Eindruck entsteht, ich würde spammen, aber ich glaube, ich hab's. Außerdem fiel mir auf, dass OnTerminate mittels Synchronize gerufen wird, das selbstdefinierte Event OnPingDone aber nicht. Das hab ich gleich korrigiert, sonst gibt's später böse Fehler.
Thread:
Delphi-Quellcode:
type
TPingThread = class(TThread)
private
FClient: TClient;
FOnPingDone: TNotifyEvent;
procedure CallOnPingDone;
protected
procedure Execute; override;
public
constructor Create(const AHost: string);
destructor Destroy; override;
property OnPingDone: TNotifyEvent read FOnPingDone write FOnPingDone;
property ReturnValue;
end;
procedure TPingThread.CallOnPingDone;
begin
if Assigned(FOnPingDone) then
FOnPingDone(Self);
end;
constructor TPingThread.Create(const AHost: string);
begin
FOnPingDone:= nil;
FreeOnTerminate:= True;
FClient:= TClient.Create(AnsiString(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 NOT Terminated then
Synchronize(CallOnPingDone);
end;
Main:
Delphi-Quellcode:
type
TfmMain = class(TForm)
private
FObject : TComplexClass;
FPingThread : TPingThread;
FPingThreadAlive : Boolean;
end;
procedure TfmMain.FormCreate(Sender: TObject);
begin
FObject:= TComplexClass.Create(FHostName);
PingThreadStart;
end;
procedure TfmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if FPingThreadAlive then begin
FPingThreadAlive:= False;
FPingThread.Terminate;
end;
end;
procedure TfmMain.PingThreadStart;
begin
FPingThreadAlive:= True;
FPingThread:= TPingThread.Create(FHostName);
FPingThread.OnPingDone:= PingThreadDone;
end;
procedure TfmMain.PingThreadDone(Sender: TObject);
var
Lsucc: Boolean;
begin
FPingThreadAlive:= False;
Lsucc:= Boolean(FPingThread.ReturnValue);
if Lsucc then
Self.Caption:= 'Connected to ' + FObject.HostName
else
MessageBox(Self.Handle, PChar(FObject.HostName + ' not available'), '', MB_OK or MB_ICONINFORMATION);
end;
Das gibt laut FastMM keine Lecks, der Destruktor des Threads wird durchlaufen, und alle drei Fälle (erreichbar, nicht erreichbar, vorzeitig terminiert) funktionieren. Falls jemand Einwände dagegen hat, immer her damit; ich lerne gern dazu (sofern ich's verstehe
).
Grüße
Dalai