Backgroundworker oder timer zum überwachen von Prozessen.

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Humax.

    Backgroundworker oder timer zum überwachen von Prozessen.

    Hallo, in meinem Programm starte ich mittels

    VB.NET-Quellcode

    1. ​process.start
    andere Programme. Bei manchen dieser gestarteten Programme muss vorher ein CD-Image gemountet werden. Dieses CD-Image soll dann nach Beendigung des gestarteten Programms wieder ausgeworfen werden. Soweit funktioniert das erstmal. Jetzt geht es dran zu optimieren...

    Bisher löse ich es so, dass ich die Process.ID auslese und in einer Schleife prüfe ob der process noch vorhanden ist, dann wird das CD-Image ausgeworfen.

    Jetzt geht es wie gesagt daran zu optimieren, weshalb ich die "Prozess-Auswertung" auslagern möchte, sodass mein Programm weiter voll genutzt werden kann.
    Ich würde dann für jedes gestartete Programm, welches ein CD-Image benötigt einen Backgroundworker oder Timer erstellen, der prüft ob der entsprechende Prozess noch läuft...

    Die Frage jetzt ist, was ist dafür besser geeignet. Ich würde zum Backgroundworker tendieren, bin aber halt nicht sicher.
    @Humax Arbeite mit dem Process.Exited-Event:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents prc As Process
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. prc = New Process
    5. prc.StartInfo.FileName = "notepad.exe"
    6. prc.EnableRaisingEvents = True
    7. prc.Start()
    8. End Sub
    9. Private Sub prc_exit(sender As Object, e As EventArgs) Handles prc.Exited
    10. MessageBox.Show("Prozess beendet")
    11. End Sub
    12. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    OK, das sieht interessant aus. Ich hatte vorher mit

    VB.NET-Quellcode

    1. ​if process.hasexcited
    prüfen wollen, aber das gab bei manchen Prozessen eine Ausnahme (Zugriff verweigert).
    Ich vermute ich habe dann mit deinem Code dieses Problem nicht oder. Werde ich heute Mittag probieren, dass sieht wirklich gut aus.
    Danke
    @RodFromGermany
    Habe dein Code die Tage mal umgesetzt, funktioniert soweit super. Danke.
    Jetzt habe ich nur das Problem, dass wenn ich beispielsweise mal 2 (oder mehr) Programme die ein CD-Image erfordern starte, der Prozess immer überschrieben wird und has.exited nur feuert wenn der zuletzt gestartete Prozess beendet ist.

    Meine Lösungsansätze / Gedanken:
    • Prozess als Array scheint nicht zu funktionieren.
    • Ich könnte mehrere Prozesse deklarieren, beispielsweise 5 und die nach und nach bei Bedarf nutzen und wenn einer fertig ist, den dann wieder freigeben. Aber da gibt es bestimmt ne saubere Methode oder?

    Humax schrieb:

    Ich könnte mehrere Prozesse deklarieren
    Genau.
    Und gib jedem sein eigenes Exited-Event, da hast Du die totale Kontrolle.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!