Killen eines Prozesses (vlc)

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von CmdKen42.

    Killen eines Prozesses (vlc)

    Hallo liebe Community,
    nachdem Ihr mir bei meinem ersten Problem so schnell, und kompetent weiterhelfen konntet, komme ich auch schon mit dem zweiten. ;(

    Ich bin dabei ein kleines Video Recorder Programm für Magenta TV zu schreiben. Dieses läuft eigentlich auch soweit ganz gut, bis auf das Ende. Als Aufnahmemedium benutze ich VLC.
    Die Aufnahme funktioniert, nur gelingt es mir leider nicht die Aufnahme zu stoppen. Dass VLC, zumindest in der Windows Version, Probleme hat ist mir bekannt. Deswegen dachte ich
    mir kille ich den Prozess einfach nach Ablauf der Zeit. Aber selbst dies geht leider nicht. Die Aufnahme läuft einfach weiter. Nun bin ich mir leider nicht sicher, ob das ein Problem
    von VLC, Windows oder meiner bescheidenden Kenntnisse ist und bitte Euch um Hilfe. Ist der Timer für die Tonne oder der Kill.Befehl oder was ganz anderes?
    Der Übersichtlichkeit halber, poste ich mal den ganzen Quelltext. Vielleicht ist ja schon an ganz anderer Stelle was schief gelaufen.
    Vielen Dank fürs lesen! :)

    VB.NET-Quellcode

    1. ​Public Class Form1
    2. Dim Zaehler As Integer = 10
    3. Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click
    4. End Sub
    5. Private Sub ListView1_SelectedIndexChanged(sender As Object, e As EventArgs)
    6. End Sub
    7. Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs)
    8. End Sub
    9. Private Sub InitializeTimer()
    10. ' Timer-Intervall auf eine Sekunde festlegen
    11. Timer1.Interval = 1000
    12. End Sub
    13. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    14. ' Set the caption bar text of the form.
    15. Me.Text = "Telekom IP Aufnahme"
    16. ListBox1.Items.Add("ARDHD")
    17. ListBox1.Items.Add("ZDFHD")
    18. ListBox1.Items.Add("3SATHD")
    19. ListBox1.Items.Add("PhoenixHD")
    20. ListBox1.Items.Add("RTL")
    21. ListBox1.Items.Add("PRO7")
    22. ListBox1.Items.Add("SAT1")
    23. ListBox1.Items.Add("VOX")
    24. ListBox1.Items.Add("ARTEHD")
    25. ListBox1.Items.Add("ZDFneoHD")
    26. ListBox1.Items.Add("ZDFinfoHD")
    27. ListBox1.Items.Add("KikaHD")
    28. ListBox1.Items.Add("WDRHD")
    29. ListBox1.Items.Add("NDRHD")
    30. ListBox1.Items.Add("HRHD")
    31. ListBox1.Items.Add("BRSüdHD")
    32. ListBox1.Items.Add("OneHD")
    33. ListBox1.Items.Add("SWRBWHD")
    34. ListBox1.Items.Add("SWRRPHD")
    35. ListBox1.Items.Add("MDRHD")
    36. ListBox1.Items.Add("RBB")
    37. ListBox1.Items.Add("Tagesschau24")
    38. ListBox1.Items.Add("SRHD")
    39. ListBox1.Items.Add("PRO7MAXXX")
    40. ListBox1.Items.Add("Kabel1")
    41. ListBox1.Items.Add("SIXX")
    42. ListBox1.Items.Add("SuperRTL")
    43. ListBox1.Items.Add("RTL2")
    44. ListBox1.Items.Add("RTLNitro")
    45. ListBox1.Items.Add("N-TV")
    46. ListBox1.Items.Add("SAT1Gold")
    47. ListBox1.Items.Add("RadioBremenTVHD")
    48. ListBox1.Items.Add("NDRHD")
    49. ListBox1.Items.Add("RTLPlus")
    50. ListBox1.Items.Add("ToggoPlus")
    51. ListBox1.Items.Add("VoxUp")
    52. ListBox1.Items.Add("ARDAlphaHD")
    53. ListBox1.Items.Add("Kabel1Doku")
    54. End Sub
    55. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    56. Dim p As New Process()
    57. Dim Kanal As String
    58. Dim Laufzeit As Integer
    59. Dim mca As String = ""
    60. Dim Jahr, Monat, Tag, Stunde, Minute, Sekunde As String
    61. Dim ProcessName As String = "vlc"
    62. Dim myProcesses() As Process = Process.GetProcesses
    63. ' Timer starten
    64. Timer1.Start()
    65. ' Dim dateiname As String
    66. Dim datum As String
    67. Timer1.Interval = 1000
    68. Kanal = ListBox1.SelectedItem
    69. Select Case Kanal
    70. Case "ARDHD"
    71. mca = "rtp://87.141.215.251@232.0.20.35:10000" '
    72. Case "ZDFHD"
    73. mca = "rtp://87.141.215.251@232.0.20.234:10000" '
    74. Case "3SATHD"
    75. mca = "rtp://87.141.215.251@232.0.20.2:10000" '
    76. Case "ARTEHD"
    77. mca = " rtp://87.141.215.251@232.0.20.10:10000" '
    78. Case "ZDFneoHD"
    79. mca = "rtp://87.141.215.251@232.0.20.236:10000" '
    80. Case "RBB"
    81. mca = "rtp://87.141.215.251@232.0.10.130:10000"
    82. Case "ZDFinfoHD"
    83. mca = "rtp://87.141.215.251@232.0.20.237:10000" '
    84. Case "OneHD"
    85. mca = "rtp://87.141.215.251@232.0.20.49:10000" '
    86. Case "KikaHD"
    87. mca = "rtp://87.141.215.251@232.0.20.85:10000" '
    88. Case "PhoenixHD"
    89. mca = " rtp://87.141.215.251@232.0.20.116:10000" '
    90. Case "NDRHD"
    91. mca = "rtp://87.141.215.251@232.0.20.104:10000" '
    92. Case "RadioBremenTVHD"
    93. mca = "rtp://87.141.215.251@232.0.20.125:10000" '
    94. Case "WDRHD"
    95. mca = "rtp://87.141.215.251@232.0.20.222:10000" '
    96. Case Is = "NDRHD"
    97. mca = "rtp://87.141.215.251@232.0.20.104:10000" '
    98. Case "HRHD"
    99. mca = "rtp://87.141.215.251@232.0.20.71:10000" '
    100. Case "BRSüdHD"
    101. mca = "rtp://87.141.215.251@232.0.20.26:10000" '
    102. Case "SWRBWHD"
    103. mca = " rtp://87.141.215.251@232.0.20.202:10000" '
    104. Case "SWRRPHD"
    105. mca = "rtp://87.141.215.251@232.0.20.203:10000" '
    106. Case "MDRHD"
    107. mca = "rtp://87.141.215.251@232.0.20.93:10000" '
    108. Case Is = "Tagesschau 24"
    109. mca = "rtp://87.141.215.251@232.0.20.205:10000" '
    110. Case "SRHD"
    111. mca = "rtp://87.141.215.251@232.0.20.200:10000" '
    112. Case "RTL"
    113. mca = "rtp://87.141.215.251@232.0.10.135:10000" '
    114. Case "Pro7"
    115. mca = "rtp://87.141.215.251@232.0.10.120:10000" '
    116. Case "Kabel1"
    117. mca = "rtp://87.141.215.251@232.0.10.82:10000" '
    118. Case "SIXX"
    119. mca = "rtp://87.141.215.251@232.0.10.157:10000" '
    120. Case "SuperRTL"
    121. mca = "rtp://87.141.215.251@232.0.10.201:10000" '
    122. Case "RTL2"
    123. mca = "rtp://87.141.215.251@232.0.10.140:10000" '
    124. Case "VOX"
    125. mca = "rtp://87.141.215.251@232.0.10.221:10000" '
    126. Case "RTLNitro"
    127. mca = "rtp://87.141.215.251@232.0.10.143:10000" '
    128. Case "N-TV"
    129. mca = " rtp://87.141.215.251@232.0.10.111:10000" '
    130. Case "SAT1"
    131. mca = "rtp://87.141.215.251@232.0.10.146:10000" '
    132. Case "SAT1Gold"
    133. mca = "rtp://87.141.215.251@232.0.10.149:10000" '
    134. Case "Pro7MAXX"
    135. mca = "rtp://87.141.215.251@232.0.10.122:10000" '
    136. Case "RTL Plus"
    137. mca = "rtp://87.141.215.251@232.0.10.240:10000" '
    138. Case "Toggo Plus"
    139. mca = "rtp://87.141.215.251@232.0.11.7:10000" '
    140. Case "VoxUp"
    141. mca = " rtp://87.141.215.251@232.0.10.239:10000" '
    142. Case "ARD Alpha HD"
    143. mca = "rtp://87.141.215.251@232.0.20.9:10000" '
    144. Case "Kabel 1 Doku"
    145. mca = "rtp://87.141.215.251@232.0.11.2:10000" '
    146. End Select
    147. Kanal = ListBox1.SelectedItem()
    148. Laufzeit = TextBox1.Text
    149. Laufzeit = Convert.ToInt32(Laufzeit)
    150. MsgBox("Du hast: " + Kanal + " und " + Laufzeit.ToString + " Minuten Laufzeit ausgewählt.")
    151. 'Umrechnung in Millisekunden
    152. Laufzeit = Laufzeit * 60000
    153. p.StartInfo.FileName = ("L:\Programme\VLC\vlc.exe")
    154. ' Datum und Uhrzeit ermitteln
    155. datum = Date.Now.ToString
    156. Jahr = DateAndTime.Year(datum)
    157. Monat = DateAndTime.Month(datum)
    158. If Monat < 10 Then Monat = "0" & Monat
    159. Tag = DateAndTime.Day(datum)
    160. If Tag < 10 Then Tag = "0" & Tag
    161. Stunde = DateAndTime.Hour(datum)
    162. If Stunde < 10 Then Stunde = "0" & Stunde
    163. Minute = DateAndTime.Minute(datum)
    164. If Minute < 10 Then Minute = "0" & Minute
    165. Sekunde = DateAndTime.Second(datum)
    166. If Sekunde < 10 Then Sekunde = "0" & Sekunde
    167. datum = Jahr & Monat & Tag & Stunde & Minute & Sekunde
    168. p.StartInfo.Arguments = ("--qt-start-minimized --sout-file-format " & mca & " --sout=#file{dst=" & """F:\VB_Projekte\Telekom Recording\Aufnahmen\Aufnahme_""" & Kanal & "_" & datum & ".mpg}")
    169. ' Aufnahme starten
    170. p.StartInfo.CreateNoWindow = True
    171. p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    172. p.Start()
    173. 'Timer setzen und Prozess nach Ablauf der Zeit killen
    174. Timer1.Interval = Laufzeit
    175. For Each proc As Process In myProcesses
    176. If InStr(proc.ProcessName.ToLower, ProcessName.ToLower) Then
    177. proc.Kill()
    178. End If
    179. Next
    180. MsgBox("Aufnahme erferfolgreich abgeschlossen.")
    181. End Sub
    182. Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    183. End Sub
    184. End Class
    Ich versteh nicht ganz. Du klickst auf Aufnahmestart und dann willst Du den VLC-Prozess im gleichen Atemzug (Zeile#201) killen? Was soll das? Und was hat es mit dem Timer (Z#197) auf sich? Wenn schon brutal, dann wär es doch sinnvoller, im Timer1_Tick-EventHandler den VLC-Prozess zu killen. Obwohl es unwahrscheinlich ist, dass dann die Aufnahme (ordentlich) gespeichert wird.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo VaporiZed,

    erstmal Danke für die schnelle Antwort.
    Ich weiß, dass das im Moment alles noch ziemlich chaotisch ist. Das mit dem Timer (Z#197) ist noch nicht zu
    Ende gedacht (wenn überhaupt gedacht)und das mit dem Killen der Anwendung ist natürlich auch keine saubere Programmierung.
    Der Witz ist jedoch, dass ich machen kann was ich will. Ich bekomme VLC nicht beendet. Momentan besteht der einzige Weg darin, das Fenster händisch zu schließen. Es ist egal,
    ob das Fenster per VB schließe oder versuche die Anwendung zu killen. Alles ist leider ohne Erfolg.
    Ich weiß einfach nicht weiter.

    CmdKen42 schrieb:

    VB.NET-Quellcode

    1. ' Datum und Uhrzeit ermitteln
    Mit nem DateTime.Now.ToString("yyyyMMddHHmmss") kannst Du das mit nem Einzeiler machen.
    Wenn Du den Prozess selbst startest, musst Du ihn nicht suchen, Du hast ihn ja.
    Du musst nur die Process-Instanz in der Klasse ablegen.
    Und dann recherchiere mal, ob es möglich ist, das Fenster mit nem SendMessage(WM_CLOSE) oder so was in der Art zu beenden.
    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!
    Hallo,
    dank Eurer Unterstützung und Anregungen habe ich das eigentlich Problem lösen können. Ich hab die entscheidenden Zeilen in die Timer.Tick Prozedur verschoben und schon
    kann ich den Prozess killen. Ich weiß, dass das auch nicht sauber ist aber leider scheint VLC auf Windows Basis einem momentan keine andere Möglichkeit zu lassen.
    Hier mal der relevante Tei:

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. Label4.Visible = True
    3. count = count - 1
    4. Label4.Text = "Noch " & count & " Sekunden."
    5. If count = 0 Then
    6. Timer1.Stop()
    7. ' geht nicht--------------------------------------------------
    8. p.StartInfo.FileName = ("L:\Programme\VLC\vlc.exe")
    9. p.StartInfo.Arguments = ("vlc://quit")
    10. p.Start()
    11. ' ------------------------------------------------------------
    12. For Each prozess In Process.GetProcessesByName("vlc")
    13. prozess.Kill()
    14. Next
    15. Label4.Text = "Ende."
    16. MsgBox("Aufnahme erferfolgreich abgeschlossen.")
    17. End If
    18. End Sub


    Ich habe den Rest des Programms noch ein bisschen aufgeräumt und optimiert und es läuft jetzt zumindest recht sauber. Ich bedanke mich bei Euch recht herzlich und wünsche schon mal ein schönes Wochenende.

    Mfg CmdKeen42

    CmdKen42 schrieb:

    VB.NET-Quellcode

    1. ' geht nicht
    Klar, dass das nicht geht.
    Du startest einen neuen Prozess und sagst ihm, er solle sich sofort beenden.
    Dein Zielprozess merkt davon nichts.
    Starte den Prozess mit Deinem Programm und merk Dir die Process-Instanz und probiere dann die Process.CloseMainWindow-Methode statt .Kill():
    docs.microsoft.com/de-de/dotne…dow?view=netframework-4.8
    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!

    masterm schrieb:

    Dann wird VLC kein weiteres mal gestartet.
    Ich mache das so:
    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!
    Klar, auch eine Möglichkeit. Hat halt nicht jeder aktiv. Wenn man sich darauf verlässt, dass ein Endnutzer in anderen Programmen bestimmte Einstellungen gesetzt hat, dann kommen Bugreports, die man nicht nachvollziehen kann, denn bei einem selber funktioniert es ja. (Spreche da aus leidiger Erfahrung...) Dieses zusätzliche Argument macht ja nix kaputt. Warum also weglassen, wenn dies dann u. U. zu Problemen führen kann? Doppelt hält besser und so.
    Alle Angaben sind ohne Gewähr, jedoch mit Pistole. Glücksspiel, Drogen und leckeres Essen können süchtig machen.

    43232069737420636f6f6c21
    Vollzitat von Post#9 durch einfaches »Anschreiben« ersetzt ~VaporiZed

    @RodFromGermany: Danke für die Antwort, wenn ich leider auch gestehen muss, dass ich sie nicht ganz verstehe. Ich hab verstanden, dass der Prozess gekillt wird, ehe er überhaupt da ist. Aber leider verstehe ich das mit der Prozess Instanz nicht. Sorry.

    MfG CmdKeen

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

    Du hast doch p schon festgelegt. Das ist Deine Process-Instanz, der Du dann VLC-Pfad und die Argumente an die Hand gibst. Sobald Du mit p.Start VLC gestartet hast, kannst Du später mit p.CloseMainWindow VLC vermutlich sauber beenden. Dazu darfst Du aber nicht p mit Dim p As New Process innerhalb einer Prozedur festlegen, sondern musst es klassenweit machen, also in der Zeile unter Public Class Form1. Damit ist dann p eine Klassenvariable und kann in jeder Prozedur der Klasse Form1 aufgerufen werden. Auch in Timer1_Tick, wo dann der Prozess beendet werden soll.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hi VaporiZed,
    vielen Dank für den Tipp. Das funktioniert.

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. Label4.Visible = True
    3. count = count - 1
    4. Label4.Text = "Noch " & count & " Sekunden."
    5. If count = 0 Then
    6. Timer1.Stop()
    7. ' geht nicht--------------------------------------------------
    8. 'p.StartInfo.FileName = ("L:\Programme\VLC\vlc.exe")
    9. 'p.StartInfo.Arguments = ("--started-from-file vlc://quit")
    10. 'p.Start()
    11. ' ------------------------------------------------------------
    12. p.CloseMainWindow()
    13. ' For Each prozess In Process.GetProcessesByName("vlc")
    14. 'prozess.Kill()
    15. 'Next
    16. Label4.Text = "Ende."
    17. MsgBox("Aufnahme erfolgreich abgeschlossen.")
    18. End If
    19. End Sub


    Das Programm wird beendet, zwar noch nicht in jedem Fall sauber (manchmal wird nur die Tonspur gespeichert) aber das ist definitiv ein VLC Problem.
    Vielen Dank für die Hilfe. Ich habe wieder mal dazu gelernt.

    MfG Keen