Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IcmpClient im Thread (https://www.delphipraxis.net/84334-icmpclient-im-thread.html)

Andru 15. Jan 2007 15:38


IcmpClient im Thread
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz