Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Jede Sekunde ein Ping (https://www.delphipraxis.net/131303-jede-sekunde-ein-ping.html)

Antigo 22. Mär 2009 20:33


Jede Sekunde ein Ping
 
Hi,
ich möchte gerne genau einmal pro Sekunde eine Adresse anpingen und dann entweder eine Antwortzeit, oder eben ein timeout haben, wobei ich dann jede Antwort die nicht innerhalb dieser einen Sekunde ankommt als timeout zähle.

In einem ersten Versuch habe ich dazu jede Sekunde einmal das Ping Programm von Windows aufgerufen, und als Parameter ein Timeout von etwas unter einer Sekunde gewählt und genau einen Ping gesendet. Die Konsolenausgabe hab ich dann geparsed und war eigentlich schon glücklich, nur dann fiel mir auf, dass bei dem Fall das er den Hostnamen der angepingt werden soll nicht auflösen kann, es mehr als eine Sekunde dauert bis ich dieses Resultat erhalte und den nächsten Ping losschicken kann. das versaut mir dann meine Statistik weil mir eine Sekunde in der ich kein Ping Resultat (Zeit oder timeout) bekommen hab fehlt.

Dann hab ich noch etwas recherchiert und die Komponente IdIcmpClient von den Jedis gefunden. Aber hier das selbe Problem, ich kann zwar ein Timeout von einer Sekunde einstellen, doch das Feststellen, dass der Hostname nicht aufgelöst werden kann, dauert ca. zwei Sekunden.

Ich hatte mir dann überlegt einfach einen Timer zu nehmen, der einmal pro Sekunde pingt (das hatte ich bisher auf schon) und für den Fall das noch keine Antwort über das Ereignis IdIcmpClient1Reply gekommen ist, diesen Ping als timeout zählt und den nächsten losschickt. Leider scheint der IdIcmpClient1.Ping(); Aufruf das Programm zu blockieren bis er den Fehler beim Auflösen des Hosts feststellt, so dass ich so auch nicht weiterkomme.

Ich müsste irgendwie das Versenden der Pings vom restlichen Programm abspalten und Auswerten aber ich habe keine rechte Ahnung von Thread Programmierung.


Ich hoffe mein Problem ist klar geworden und jemand hatt eine Idee wie ich es schaffe sekündlich einen Ping zu versenden und falls in der Zeit bis zum nächsten Ping keine Antwort kommt diesen zu verwerfen.


Ich danke schonmal im Vorraus.

Christian Seehase 22. Mär 2009 21:52

Re: Jede Sekunde ein Ping
 
Moin Michael,

such' hier mal nach Hier im Forum suchenIcmpSendEcho.
Das wäre dann direkt die API-Funktion der ein Ping ausgeführt wird.
Vielleicht kommst Du damit weiter.

Antigo 22. Mär 2009 22:12

Re: Jede Sekunde ein Ping
 
danke für den hinweis. ich werd mich mal schlau machen.

Vielleicht hat ja zwischenzeitlich noch jemand Ideen zu folgendem:

wollte das ganze jetzt doch mit der ping.exe von Window lösen. Idee war diesen Aufruf in einen Thread auszulagern und mit einem timer nach einer Sekunde zu gucken ob eine Antwort gekommen ist und diese ausgeben. Falls keine Antwort gekommen ist, sollte der Thread beendet werden ein Timeout ausgegeben und ein neuer Thread gestarten werden. Das Problem ist, dass ich den Thread der ja noch läuft nicht beenden kann... daher hab ich ein Speicherleck soweit ich das beurteilen kann, denn im Taskmanager wird der vom Programm verbrauchte Speicher immer größer...

Der Thread
Delphi-Quellcode:
procedure TMyThread.Execute;
begin
  beep;
  str:=Konsole('ping heise.de1 -n 1 -w 800');
  if not terminated then
    Synchronize(Update)
  else self.free;
end;

procedure TMyThread.Update;
begin
  Form1.SetTime(str);
end;

procedure TForm1.SetTime(Atime:string);
begin
  time:=Atime;
  done:=true;
end;
Der Timer
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  mythread:=TMyThread.Create(false);
  timer1.enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if done then
    memo1.lines.Add(FormatDateTime('dd.mm.yyyy, hh:mm:ss: ',Now)+time)
  else
    memo1.lines.Add(FormatDateTime('dd.mm.yyyy, hh:mm:ss: ',Now)+'Timeout');
 
  mythread.Terminate;
  mythread:=TMyThread.Create(false);
end;

Funktionieren tut das ganze sogar, nur wie gesagt wird der Speicher Verbrauch immer gößer, da die Threads wohl alle bestehen bleiben.


Jemand ne idee?

Christian Seehase 22. Mär 2009 22:19

Re: Jede Sekunde ein Ping
 
Moin Michael,

hast Du FreeOnTerminate des Threads auf true gesetzt?

Antigo 22. Mär 2009 22:26

Re: Jede Sekunde ein Ping
 
hab ich grad probiert, ändert aber leider nichts am steigenden Speicherverbrauch. Trotzdem danke für den tipp.

edit: hab jetzt mal das verzweiflung self.free aus der Execute Prozedur des Threads gelöscht, jetzt steigt der Speicher Verbrauch nicht mehr bei jedem ping an, sondern nur noch ab und an um wenige K. Wieweit ist sowas denn normal oder sollte das nicht eigtl gar nicht ansteigen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:40 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