Programm hängt trotz Kill-Befehl

  • VB.NET

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von eichseinet.

    Versuch folgendes:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class KillProgramm
    2. <System.Runtime.InteropServices.DllImport("Kernel32.dll", SetLastError:=True, CharSet:=System.Runtime.InteropServices.CharSet.Auto, CallingConvention:=System.Runtime.InteropServices.CallingConvention.StdCall)> _
    3. Private Shared Function TerminateProcess(ByVal hwnd As IntPtr, ByVal uExitCode As Integer) As Boolean
    4. End Function
    5. ''' <summary>
    6. ''' Versucht einen Prozess zu beenden.
    7. ''' </summary>
    8. ''' <param name="Name">Name des Prozesses</param>
    9. ''' <param name="WaitFor">Wieviele Millisekunden soll zwischen den Versuchen gewartet werden</param>
    10. ''' <param name="Trys">Wie oft soll es versucht werden bis der Prozess Terminiert wird</param>
    11. ''' <param name="Silent">Bei False wird eine Userabfrage eingeblendet</param>
    12. ''' <example><code>KillProgramm.Kill("NameDesProgramms")</code></example>
    13. ''' <remarks></remarks>
    14. Public Shared Sub Kill(ByVal Name As String, Optional ByVal WaitFor As Integer = 1000, Optional ByVal Trys As Integer = 15, Optional ByVal Silent As Boolean = True)
    15. Dim KillTrys As Integer = 0
    16. Do Until KillTrys >= Trys
    17. For Each Process In System.Diagnostics.Process.GetProcessesByName(Name)
    18. Process.Kill()
    19. System.Threading.Thread.Sleep(WaitFor)
    20. If System.Diagnostics.Process.GetProcessesByName(Name).Count > 0 Then
    21. KillTrys += 1
    22. Else
    23. KillTrys = Trys + 1
    24. End If
    25. Next
    26. Loop
    27. If System.Diagnostics.Process.GetProcessesByName(Name).Count > 0 Then
    28. If Silent OrElse MsgBox(String.Format("Terminate all processes({0})?", Name), vbYesNo) = DialogResult.Yes Then
    29. For Each p As Process In System.Diagnostics.Process.GetProcessesByName(Name)
    30. TerminateProcess(p.Handle, 0)
    31. Next
    32. End If
    33. End If
    34. End Sub
    35. End Class


    Aufgerufen wird die Klasse so:

    VB.NET-Quellcode

    1. KillProgramm.Kill("NameDesProgramms")


    Das Versucht zuerst den Prozess über kill zu beenden, schlägt dies fehl wird dieser terminiert.

    Achtung: Der Terminate Befehl kann evtl. zu System-Instabilität führen!!
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D
    Da es sich um ein TV Programm handelt, kann ich sagen, habe manchmal ein ähnliches Problem mit TerraTec HomeCinema, das stürzt auch manchmal ab und lässt sich nicht richtig beenden, also das TV PRogramm schon aber es gibt noch ein zusatz Process der auf den Treiber zugreift und da hakt es dann. Diesen Process kann ich weder mit dem Taskmanager noch irgendwelchen anderen Windows Befehlen killen, da hilft bei mir leider immer nur ein Neustart, weil sich wirklich etwas zwischen der Soft und Hardware ebende verrannt hat und da muss ein kompletter Reset her.
    Danke schonmal für die Antworten.
    @BiedermannS: Den Code werd ich gleich mal testen und anschließend ins Programm einfügen zum Langzeitversuch. Danke!
    @Dodo: schön mal Erfahrungen von anderen TV-Karten Besitzern zu hören. Einige Male konnte die TV-Karte durch deaktivieren/aktivieren im Gerätemanager wieder zum Leben erweckt werden. Das hab ich jetzt über das Tool devcon.exe automatisiert. (vor 3Tagen) Leider klappt's nicht immer; der restart will nicht, weil sich etwas aufgehangen hat. Das ist wohl der Punkt den Du beschrieben hast.
    Um den Befehl taskkil IM Dvbdream.exe /f zu testen hab ich das TV-Programm mal etwas gestresst. Leider stürzt es mir dann immer so extrem ab, dass es gar nicht zu geht; auch über den Taskmanager nicht.

    Ich werd jetzt alle neuen Teile meinem Programm hinzufügen und auf Dauer testen und mitschreiben welcher Befehl es "töten" konnte. ;)
    Werde sie einfach in Reihe schalten, zuletzt die Karte reseten und als letztes Mittel startet der PC halt neu. Dann sind wenigsten die folgenden Aufnahmen nicht futsch.

    bis bald

    eddi
    Ich habe das Problem gelöst indem ich mir eine neue TV Karte geholt habe, davor hatte ich so ein DVB-T Stick und der war an meinem MediaCenter welches natürlich tag ein tag aus lief und ebenso das Fernseh Programm, natürlich ohne Video und Audio ausgabe. Wenn ich nun etwas aufnehmen wollte klappte es, solange die Sendung noch nicht lief bzw. noch nicht die 10 Minuten Vorlaufzeit erreicht wurden, möchte ich also um 20:15 etwas aufnehmen und programmiere die Aufnahme erst um 20:10 dann hängt sich das Programm auf. Nach einem Neustart (Runterfahren geht auch nicht wenn der Treiber hängt) funktioniert das Aufnehmen wieder normal, aber wenn das Programm länger läuft scheint da irgendwas schief zu laufen. Finde auch das alle TV Programme irgendwie ziemlich schlecht programmiert wurden -.-
    @Dodo: Seh ich das richtig; der PC ist immer an? Mein TVPC wird nach der Aufnahme immer schön in den Ruhezustand gefahren und wacht zur nächsten wieder auf. Programmiert wird's über den Windows-Taskplaner. Da liegen aber auch die Probleme: 1. viele TV-Karten funktionieren nach dem Ruhezustand nicht mehr. (da wird die Karte vom Treiber wohl nicht mehr richtig angesprochen) Vermutlich kann ich dieses Problem in Zukunft umgehen, indem ich über devcon.exe die Karte zu Beginn resete. (wenn mal eine neu fällig wäre)
    2. Die Software der Karten ist unter aller SAU! Viel zu umständlich und vor allem ermöglicht keine es den PC in den Ruhezustand zu versetzten. (auch wenn die Karte / Treiber es können) Daher nutze ich DVBDream.


    Gruß

    eddi