Thema: Delphi IcmpClient im Thread

Einzelnen Beitrag anzeigen

Andru

Registriert seit: 1. Feb 2006
Ort: Salzgitter
24 Beiträge
 
Delphi 6 Enterprise
 
#1

IcmpClient im Thread

  Alt 15. Jan 2007, 15:38
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.
  Mit Zitat antworten Zitat