Endlosschleife in Prozess A von Prozess B beenden



  • Hi,

    ich habe einen Prozess A, der einen Serverdienst anbietet und dazu in einer Endlosschleife auf Socketverbindungen wartet.

    Bisher schieße ich den Prozess A mit einem Prozess B ab, welcher

    TerminateProcess
    

    mit der PID von Prozess A aufruft.

    Allerdings habe ich das Problem, dass ich in Prozess A nach der Schleife noch einige Operationen ausführen möchte, um Prozess A sauber zu beenden. Mit der jetzigen Quick&Dirty-Methode ist das nicht möglich.

    Im Grunde suche ich also eine solche Lösung:

    // Prozess A
    main() {
    
     while (!ProzessB->Signal) {
       serve_client_requests();
     }
     clean_up();
     do_other_important_things();
    
    return 0;
    }
    

    bzw.

    // Prozess A
    main() {
    
     while (1) {
       serve_client_requests();
       if(ProzessB->Signal)
         break;
     }
     clean_up();
     do_other_important_things();
    
    return 0;
    }
    

    Kann mir da jemand 'nen Hinweis geben?

    Gruß, Thomas



  • Wenn Du einen Dienst ("Service") hast, dann solltest Du auch den Service beenden, dann wird dort der ServiceEntry mit "SERVICE_CONTROL_STOP" oder "SERVICE_CONTROL_SHUTDOWN" aufgerufen!

    Siehe auch:
    http://www.codeproject.com/system/serviceskeleton.asp



  • Hallo Jochen,

    mein Serviceprozess läuft in Form einer ausführbare Applikation (exe), das macht imho das Debuggen einfacher.
    Hab noch vergessen zu erwähnen, dass meine Plattform Windows CE ist, das NT-Tutorial scheint sich nicht so einfach übertragen zu lassen.

    Gibts keine Möglichkeit, ein Signal in eine exe einzuschleusen oder eine Art globalen Speicher als Austauschplattform zu benutzen?
    Hab schon überlegt, zyklisch eine Datei von der Festplatte einzulesen, in welcher ein anderer Prozess das Signal zum Stoppen ablegt. Ist aber glaube ich nicht besonders elegant und recht resourcenhungrig. 😉

    Gruß, Thomas



  • Du könntest mit PostThreadMessage deiner Anwendung eine Nachricht schicken. Allerdings wird ein Nachrichten-Queue erst erstellt, wenn du ein Fenster erstellst (gibts noch mehr Fälle?).

    Ansonsten:
    Das mit Datei ist gar nicht so eine schlechte Idee.
    Beispiel: Wenn dein Service startet, löscht er die (evtl. vorhandene) Datei im Temp-Ordner "MsgForYourServiceEigeneBezeichnung.dat". In der Schleife dann überprüft der Service in regelmäßigen Abständen, ob eine Datei mit diesem Namen im Temp-Ordner erstellt wurde. Wenn ja, beendet er sich. Zur "Sicherheit" könntest du noch irgendwelche Verifizierungsdaten in die Datei reinschreiben.
    Dürfte eigentlich nicht so ressourcen-fressend sein.

    Edit: Wenn du eine schnell durchlaufende Schleife hast, könntest du ja auch nur alle 100 Durchläufe nach der Datei checken.


Anmelden zum Antworten