Prozess nach xxx Minuten killen

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von fichz.

    Prozess nach xxx Minuten killen

    yo ihrs,

    hätte eine Frage zum Thema Prozess.
    Es werden verschiedene Prozesse automatisiert gestartet (wenn gewisse Bedienungen übereinstimmen).
    Nun kann man bei jedem Prozess eine maximale Dauer festlegen wie lange der Prozess laufen darf.

    Wie kann ich nun einen Process killen bzw. beenden (es werden teilweise .cmd, .bat, .vbs Dateien gestartet welche eingestellt werden müssen) wenn die Dauer erreicht wurde?

    der Prozess wird in einem eigenen Thread gestartet.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    VB.NET-Quellcode

    1. MyProcess.Kill()
    2. MyProcess.CloseMainWindow()


    ------------------------
    Das ist keine Reihenfolge, sondern eine Aufzählung von Möglichkeiten.
    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!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    naja es lauft so ab:
    Es wird (nur) ein Thread gestartet welcher einen Sub aufruft (logisch)
    in dem Sub wird mit einer For-Schleife alle in einer Listbox befindlichen Items 1 Prozess gestartet. (Hierzu wird in einer db der Pfad und Parameter gelesen)

    Hier mal der Code:

    VB.NET-Quellcode

    1. Private Sub tmrMain_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrMain.Tick
    2. testthread = New Thread(AddressOf test)
    3. testthread.IsBackground = True
    4. testthread.Start()
    5. End Sub


    hier der Sub

    VB.NET-Quellcode

    1. Private Sub test()
    2. Dim szSql As String ' SQL - Statement
    3. Dim adoRead As SqlClient.SqlDataReader ' SQL - Daten
    4. For i As Integer = 0 To lstScheduleMain.Items.Count - 1
    5. Try
    6. szSql = "select FILEPATH, FILEPARAM, ACTIVE_FG from "
    7. szSql &= "AGENT_PROCESS where PROC_ID=" & CStr(iScheduleTaskID(i))
    8. g_adoCmd5.Connection = g_adoCon5
    9. g_adoCmd5.CommandType = CommandType.Text
    10. g_adoCmd5.CommandTimeout = 0
    11. g_adoCmd5.CommandText = szSql
    12. g_adoCmd5.Parameters.Clear()
    13. adoRead = g_adoCmd5.ExecuteReader
    14. If adoRead.HasRows Then
    15. While adoRead.Read
    16. Dim _active_fg As Integer = CInt(IIf(IsDBNull(adoRead.Item("ACTIVE_FG")), "", adoRead.Item("ACTIVE_FG")))
    17. Dim _filepath As String = CStr(IIf(IsDBNull(adoRead.Item("FILEPATH")), "", adoRead.Item("FILEPATH")))
    18. Dim _fileparam As String = CStr(IIf(IsDBNull(adoRead.Item("FILEPARAM")), "", adoRead.Item("FILEPARAM")))
    19. If _active_fg = 1 Then
    20. Dim _process As New Process
    21. _process.StartInfo.FileName = _filepath
    22. _process.StartInfo.Arguments = _fileparam
    23. _process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    24. _process.Start()
    25. End If
    26. End While
    27. adoRead.Close()
    28. End If
    29. Catch ex As Exception
    30. MessageBox.Show(ex.Message)
    31. End Try
    32. Next
    33. End Sub


    Ist der Code so wie ist überhaupt so fähig einen Prozess wieder zu Killen?

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    VB.NET-Quellcode

    1. Dim _process As New Process

    muss aus der Schleife in die Klasse, ggf. eine List(Of Process) anlegen.
    Dann kannst Du die Prozesse auch killen.
    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 mit der List (Of Process) klingt intressant.

    Habe das nun mal so gemacht (Deklaration aus der Schleife und füge nun nach jedem Porcess.Start() es mit .Add zur Liste)
    Scheint auch zu funktionieren. (Kann es leider nur bedingt testen mit einem Button da ich noch nicht so weit bin ^^ )

    Ich poste mal den Aktuellen Code

    VB.NET-Quellcode

    1. Private Sub test()
    2. Dim szSql As String ' SQL - Statement
    3. Dim adoRead As SqlClient.SqlDataReader ' SQL - Daten
    4. Dim _process As New Process
    5. For i As Integer = 0 To lstScheduleMain.Items.Count - 1
    6. Try
    7. szSql = "select FILEPATH, FILEPARAM, ACTIVE_FG from "
    8. szSql &= "AGENT_PROCESS where PROC_ID=" & CStr(iScheduleTaskID(i))
    9. g_adoCmd5.Connection = g_adoCon5
    10. g_adoCmd5.CommandType = CommandType.Text
    11. g_adoCmd5.CommandTimeout = 0
    12. g_adoCmd5.CommandText = szSql
    13. g_adoCmd5.Parameters.Clear()
    14. adoRead = g_adoCmd5.ExecuteReader
    15. If adoRead.HasRows Then
    16. While adoRead.Read
    17. Dim _active_fg As Integer = CInt(IIf(IsDBNull(adoRead.Item("ACTIVE_FG")), "", adoRead.Item("ACTIVE_FG")))
    18. Dim _filepath As String = CStr(IIf(IsDBNull(adoRead.Item("FILEPATH")), "", adoRead.Item("FILEPATH")))
    19. Dim _fileparam As String = CStr(IIf(IsDBNull(adoRead.Item("FILEPARAM")), "", adoRead.Item("FILEPARAM")))
    20. If _active_fg = 1 Then
    21. _process.StartInfo.FileName = _filepath
    22. _process.StartInfo.Arguments = _fileparam
    23. _process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    24. _process.Start()
    25. tmpProcessList.Add(_process)
    26. End If
    27. End While
    28. adoRead.Close()
    29. End If
    30. Catch ex As Exception
    31. MessageBox.Show(ex.Message)
    32. End Try
    33. Next
    34. End Sub

    zur Zeit der Button für Kill

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. For i As Integer = 0 To tmpProcessList.Count - 1
    3. If Not tmpProcessList(i).HasExited Then
    4. tmpProcessList(i).Kill()
    5. End If
    6. Next
    7. End Sub


    BTW: wie lange kann so eine List Of den werden?

    lg und danke ;)
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    ich glaube Int32.MaxValue, also 2 ^ 32(evtl. / 2, da es nicht unsigned ist...)...Ansonsten solange wie der Speicher reicht^^
    Aufjedenfall reicht es für die Anzahl der Prozesse die bei dir laufen dürften :P
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---