Aloha,
ich hoffe ihr könnt mir bei meinen Problemen helf. Verstehe wirklich nicht, warum das solche Macken macht.
Sind meine ersten versuche mit Threads und möchte da jede Sekunde einen Ping abschicken.
Allerdings so, dass die weitere Arbeit nicht blockiert - daher der Thread.
Wollte mir eigentlich ne Timer-Komonente im Thread erstellen, komme aber nicht ins OnTimer-Ereignis.
Also kenne das nur auf einem Form, dass man sagen muss 'Enabled := true' und schon läuft er. Aber
der Thread beendet sich dann bei mir.
Das Problem konnt ich zwar erstma umgehen, aber habe das nur gemacht, um den Thread am Leben zuhalten.
Das größere Problem ist eigentlich, dass ich die
Indy-Komponente IdIcmpClient nicht wirklich erzeugen kann.
Ich kann alles kompilieren, bekomme aber denn eine
Access-Violation...
Kann mir jemand sagen warum?
Danke im Vorraus!
Gruß,
Andru
Delphi-Quellcode:
unit uPingSensor;
interface
uses
Classes, ExtCtrls, IdIcmpClient, fSettings, SysUtils, server_implementation;
type
PingSensor =
class(TThread)
private
{ Private declarations }
procedure initPing;
procedure getInit;
procedure PingTimerTimer(Sender:TObject);
procedure IdIcmpClient1Reply(ASender: TComponent;
const AReplyStatus: TReplyStatus);
procedure UpdatePing;
protected
procedure Execute;
override;
end;
implementation
var
PingTimer: TTimer;
IdImcpClient1: TIdIcmpClient;
pingHost:
String;
pingPort: Integer;
SensorExists: Boolean;
{ PingSensor }
procedure PingSensor.Execute;
begin
Synchronize(getInit);
initPing;
while not Terminated
do
begin
PingTimerTimer(self);
sleep(1000);
end;
end;
procedure PingSensor.getInit;
begin
pingHost := server_implementation.configIP;
pingPort := server_implementation.configPort;
end;
procedure PingSensor.initPing;
begin
try
{ IdImcpClient1 := IdImcpClient1.Create(nil); //An dieser Stelle knallt es immer...
with IdImcpClient1 do
begin
Host := pingHost;
Port := pingPort;
ReceiveTimeout := 1500;
OnReply := IdIcmpClient1Reply;
end;
} except
PingTimer := TTimer.Create(
nil);
PingTimer.OnTimer := PingTimerTimer;
PingTimer.Interval := 1000;
PingTimer.Enabled := true;
end;
end;
procedure PingSensor.PingTimerTimer(Sender:TObject);
begin
try
IdImcpClient1.Ping
finally
Synchronize(UpdatePing);
Execute;
end;
end;
procedure PingSensor.IdIcmpClient1Reply(ASender: TComponent;
const AReplyStatus: TReplyStatus);
begin
SensorExists := AReplyStatus.ReplyStatusType = rsEcho;
end;
procedure PingSensor.UpdatePing;
begin
fsettings.SExists := SensorExists;
end;
end.