Aktionen bearbeiten während Ping an einen Rechner



  • Hallo,
    ich benutze die die Indy-Komponente IdIcmpClient, um mehrere Rechner nacheinander anzupingen. Wird jetzt jedoch ein Rechner angepingt, der nicht im Netz ist, dann dauert es ca. 5 Sekunden, bis mein Programm wieder auf eine Aktion (z.B. Mausklick auf einen Button) reagiert. Auch der Befehl Application->ProcessMessages vor dem Ping-Befehl bringt nichts.
    Wie kann ich also ständig während der Ausführung meines Programmes regelmäßig Pings absetzen ohne andere Aktionen zu blockieren?

    Danke für eure Lösungen!



  • Original erstellt von teacherwilli:
    [...]Auch der Befehl Application->ProcessMessages vor dem Ping-Befehl bringt nichts[...]

    DIe Aussage zeugt eindeutig davon,dass du nicht begriffen hast, wieso und wann man Application->ProcessMessages() einseetzen sollte. Das Versäumnis solltest du dringend durch Nachlesen in der Hilfe nachholen!

    Ich denke wirklich gut wirst du das Pingen nur nebenher laufen lassen können wenn du einen Thread dafür benutzt.

    -junix



  • nur leider ist das mit dem threads garnicht so einfach @ junix

    hab auch im Forum hier nichts dazu gefunden...

    ich habe ein ähnliches Problem



  • TThread ist ne Klasse die den Umgang mit Threads erleichtern sollte. Ich weiss nicht ob man vielleicht mit Google einige gute tutorials zu dem Thema finden könnte. auf http://msdn.microsoft.com hats auch ganz interessante Artikel zum Thema multithreading (was so zu beachten ist und so) In der Borland-Hilfe sollte auch das Eine oder andere stehen. Hab leider grad nix so zur Hand was man als Tutorial anpreisen könnte ):

    -junix



  • Threads zu erzeugen ist garnicht so schwer...hier ein Beispiel anhand eines Timers :

    void runner(void *threadno); //Thread starten 
    void start_timer(void); //Der Threadcode
    
    int run_time; //ich habe eine Zähler Variable Global
                  //Deklariert, da müßte man sich eventuell was 
                  //Besseres Ausdenken, aber sone Uhr kann man 
                  //ja auch noch für mehr benutzen - z.b. Framing ? 
    
    void start_timer(void){
    int thread_id;
    int i = 1;
    thread_id = _beginthread(runner,4096,(void *)i);
    return 0;
    }
    
    void runner(void *threadno){
    printf("Executing timer %d, ID = %d, \n",(int)threadno, _threadid);
    for(run_time = 0; run_time < 30; run_time++){
    sleep(1);
    }
    _endthread();
    }
    


  • btw. weil du was von ping sagtest.... Ich habe das mal für ein Socket benutzt, weil ein Non Blocking Socket erschien mir da nicht so gut zu sein...



  • <Backticktz>: Nichts für ungut, aber wozu soviel WinAPI und C verwenden wenn man - dank VCL - in TThread nur Execute zu überschreiben braucht? (-; Ausserdem lohnen sich die MSDN-Artiekl über Multithreading dennoch da vor Allem auch Synchronisationsmechanismen wie Semaphoren, Mutexe etc behandelt werden.

    -junix


Anmelden zum Antworten