Laufenden Prozess überwacht beenden

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ProcessControl.

    Laufenden Prozess überwacht beenden

    Hallo zusammen,

    ich muss zu Update-Zwecke ein Prozess und ein Service beenden.

    Das beenden ist nicht das Problem, über x.addrange(process.getprocessesbyname..) hole ich mir den Prozess und per prozess.kill dann beenden.

    Vom Design her würde ich aber lieber den Prozess kontrolliert beenden, quasi im Form melden "Prozess ... wird beendet, ... XX Sekunden übrig", wobei XX ein Wert in Sekunden ist der per CountDown auf 00 gezählt wird.

    Während dem CountDown warte ich auf das Ende des Prozess, tritt das ein vor Ende 00 fahre ich im Programm sofort weiter, ansonsten erfolgt der nächste Step und eine Meldung wird protokolliert (Prozess konnte nicht beendet werden).

    Das Problem ist die Anwendung nicht zu blockieren.

    Wie könnte ich das erledigen um sicherzustellen das alles soweit klappt bevor ich Dateien kopieren kann?

    Viele Grüsse,
    Daniel

    DniBo schrieb:

    Das Problem ist die Anwendung nicht zu blockieren.
    Deine eigene oder die, die Du beenden willst?
    Es gibt keinen sicheren Mechanismus, eine Anwendung von außen "langsam" zu beenden.
    Du kannst dem Fensterhandle natürlich per SendMessage() ein WM_CLOSE schicken, aber wenn die Anwendung nicht will, läuft sie weiter.
    Da hilft eben doch nur das Process.Kill().
    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!
    Hi,

    danke für Deine Rückmeldung, sowas habe ich fast befürchtet...

    Dann werde ich wohl das ganze per process.kill starten und dann eine Schleife bauen die jede Sekunde abfrägt ob die Prozesse beendet sind und dann ggf eine Meldung wirft.

    Viele Grüsse,
    Daniel
    Sieh Dir mal dies an:

    VB.NET-Quellcode

    1. Dim pr() As Process = Process.GetProcessesByName("Notepad")
    2. If pr.Length > 0 Then
    3. pr(0).Kill()
    4. pr(0).WaitForExit()
    5. End If
    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!
    Hi,

    stimmt, da war ja noch was. Das hatte ich aber mal wieder verworfen da hier gewartet wird bis der Prozess zu ende kommt. Damit wartet das Programm aber auch und mal kann es nicht gezielt abwürgen.

    Man kann zwar noch die Wartezeit angeben, aber in dieser Zeit friert die Anwendung ein.

    Oder täusche ich mich da?

    Gruss,
    Daniel
    Korrekt, Wartezeit in Millisekunden:

    VB.NET-Quellcode

    1. pr(0).WaitForExit(100)
    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!

    Klasse! Ein Klatsche, zwei Fliegen! :-))

    RodFromGermany schrieb:

    Dim pr() As Process = Process.GetProcessesByName("Notepad")
    If pr.Length > 0 Then
    pr(0).Kill()
    pr(0).WaitForExit()
    End If


    Danke! Damit ist nun wahrscheinlich auch eines meiner Probleme gelöst!

    Ich hatte in der Vergangenheit Schwierigkeiten mit einer "Shell" Anwendung für VNC Clients. (Fernüberwachung Operator Terminals)

    Manchmal konnte (aus nicht bekannten Gründen) ein Client nicht sauber beendet werden. Mit der Zeit und jedem neuen User-Click auf einen anderen Client "stauten" sich dann im Taskmanager die Prozess-"Leichen" auf. Mit dem von dir beschriebenen Code sollten sich eigentlich auch solche Leichen (kontrolliert) entfernen lassen.