Vom Programm ausgeführte Prozesse zählen



  • Hallo,

    ich öffne in einer Schleife ein externes Berechnungsprogramm in einem
    Prozess. Jetzt möchte ich gerne, dass das externe Programm maximal drei
    mal gleichzeitig ausgeführt wird. Hat jemand eine Idee wie ich das machen
    könnte?

    Grüße,
    Huddi



  • Du kannst doch einfach mitzählen wie oft das Tool gestartet wurde.
    Und das Beenden erfährst Du über das Exited-Event

    http://msdn.microsoft.com/de-de/library/system.diagnostics.process.exited(v=vs.80).aspx



  • Ja genau, aber dafür muss ja der Prozess global definiert sein, richtig?
    Dann kann ich ja nicht mehrere Instanzen von dem Prozess gleichzeitig aufrufen?!



  • Ich versteh Dein Problem nicht.
    Du hast doch die Kontrolle darüber, wie und wo in Deinem Programm dieses Tool gestartet wird. Ein kleiner Counter zählt mit, fertig.



  • Nein das geht ja leider nicht. Der Zähler zählt ja einfach stur weiter, aber die Prozesse beenden nach und nach.



  • Darum solltest du ja auch (wie oben schon von _nix vorgeschlagen), das Exited-Ereignis abonnieren und kannst dort dann den Zähler wieder runterzählen.
    Oder aber du holst dir per Process.GetProcessesByName die Anzahl der noch offenen Prozesse und vergleichst diese, bevor du einen neuen Prozess startest.



  • Oh Wahnsinn, das funktioniert ja doch.
    Allerdings abonniere ich jetzt das Exited Event immer mitten im Code in
    der Schleife. Ist bestimmt unschön oder :)?
    Funktioniert aber einwandfrei so wie ich das sehn kann.



  • huddi schrieb:

    Oh Wahnsinn, das funktioniert ja doch.

    Oh Wahnsinn, wer hätte das gedacht 😃

    huddi schrieb:

    Allerdings abonniere ich jetzt das Exited Event immer mitten im Code in
    der Schleife. Ist bestimmt unschön oder :)?
    Funktioniert aber einwandfrei so wie ich das sehn kann.

    Events in einer Schleife abonnieren ist doch kein Problem. Zusammen mit Lambdas finde ich das sogar recht elegant.

    Du könntest nur auf ein Problem stoßen: Wenn Du innerhalb der Schleife die Process-Objekte erstellst und nur Schleifen-lokale Referenzen hast (so hört es sich bisher jedenfalls an), sind sie in der nächsten Iteration Freiwild für den Garbage-Collector. Die Process-Objekte in der Schleife halten eine Referenz auf die Eventhandler des Exited-Events, aber kein anderes Objekt hält mehr eine Referenz auf die Process-Objekte. Das wäre in dem Fall reines Glücksspiel, ob die Objekte den Zeitraum der Beobachtung überleben, oder vom GC einkassiert werden. Werden sie zerstört, können sie auch kein Event mehr feuern und Dein Zähler wird nicht wie erwünscht dekrementiert.
    Falls Du also innerhalb der Schleife die Process-Objekte erstellst, solltest Du die Referenzen darauf in einer beliebigen Collection eines höheren Scopes ablegen.


Anmelden zum Antworten