Indy-Pinger mit Threads: Doppelte Einträge
-
Hallo,
Ich habe ein Ping-Programm mit TIdIcmpClient geschrieben, das für jeden Ping einen eigenen Thread aufruft und die Antwort-Adresse dann in eine Liste einträgt. Mein Problem: Anscheinend wird eine Ip-Adresse, die beantwortet wurde manchmal öfter in die Liste eingetragen und ich kann mir nicht erklären warum.
Mein Hauptformular
#include <vcl.h> #pragma hdrstop #include "Main.h" #include "PingThread.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { ipListe = new TStringList(); //in Main.h deklariert. Hier sind alle zu pingenden IPs drin ipListe->LoadFromFile("c:\\ips.txt"); pingedIps = new TStringList(); //in Main.h deklariert. Hier kommen alle Antwort-Ips rein. Wird vom Thread eingetragen pingFertig = new TEvent(NULL, true, false, "pingFertig"); //in Main.h deklariert. Signalisiert, ob alle Threads beendet sind } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { for(int i=0;i<ipListe->Count;i++){ new PingThread(false, ipListe->Strings[i]); //für jede Ip einen neuen Thread } pingFertig->WaitFor(5000); //Warten bis alle Threads fertig sind Memo1->Lines = pingedIps; //Alle IPs im Memo anzeigen }
Der PingThread
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "PingThread.h" #include "Main.h" #pragma package(smart_init) //--------------------------------------------------------------------------- __fastcall PingThread::PingThread(bool CreateSuspended, AnsiString pingIp) : TThread(CreateSuspended) { this->pingIp = pingIp; //übergebene IP aus HauptFormular speichern } //--------------------------------------------------------------------------- void __fastcall PingThread::Execute() { TIdIcmpClient *pinger = new TIdIcmpClient(NULL); pinger->Host = pingIp; pinger->ReceiveTimeout = 500; pinger->Ping(); Form1->pingedIps->Add(pinger->ReplyStatus.FromIpAddress); //Ip auslesen, die geantwortet hat und in Liste eintragen if(++Form1->gepingt == Form1->ipListe->Count){ //Zähler erhöhen Form1->pingFertig->SetEvent(); //wenn letzter Thread: Ereignis setzen } }
Die Liste die ich verwendet habe (ips.txt):
192.168.0.100
127.0.0.1
192.168.0.101
192.168.0.76
192.168.0.103
192.168.0.75
192.168.0.77
192.168.0.78Das Ergebnis sieht im Memo so aus:
192.168.0.100 //das ist meine IP. Das ist ok 127.0.0.1 //das auch 192.168.0.100 //hier sollte eigentlich 0.0.0.0 stehen (=keine Antwort bekommen) 192.168.0.100 //hier sollte eigentlich 0.0.0.0 stehen (=keine Antwort bekommen) 192.168.0.100 //hier sollte eigentlich 0.0.0.0 stehen (=keine Antwort bekommen) 192.168.0.100 //hier sollte eigentlich 0.0.0.0 stehen (=keine Antwort bekommen) 192.168.0.100 //hier sollte eigentlich 0.0.0.0 stehen (=keine Antwort bekommen) 192.168.0.100 //hier sollte eigentlich 0.0.0.0 stehen (=keine Antwort bekommen) 192.168.0.100 //hier sollte eigentlich 0.0.0.0 stehen (=keine Antwort bekommen)
Vielleicht ist das auch ein Thread Problem: weil manchmal wenn ich mit dem Debugger schrittweise ausführe, trägt er weniger Zeilen ein. Ich kanns´mir nicht erklären...
-
Weiß keiner Rat? Es ist wahrscheinlich zu viel verlangt, den ganzen Quelltext zu lesen, aber vielleicht hat irgendjemand eine Idee??
Ich habe festgestellt, dass, wenn ich den Timeout für den Ping erhöhe, manchmal die Antwort 0.0.0.0 zurückkommt. Habe das ganze auch mit einer TThreadList versucht, aber ohne Erfolg...