Über den Streamwriter (mit Hilfe von Readline) "Process" Text per Readline auslesen

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von haiyyu.

    Über den Streamwriter (mit Hilfe von Readline) "Process" Text per Readline auslesen

    Ich versuche vergeblich dein letzten Text der von Process (Konsolenanwedung in diesem Fall) auszulesen.

    Mein Code bisher

    VB.NET-Quellcode

    1. Dim dieZeile As String
    2. Dim reader As StreamReader = prog.StandardOutput
    3. Do While prog.HasExited = True
    4. Application.DoEvents()
    5. dieZeile = reader.ReadLine
    6. Me.Text = dieZeile
    7. Loop
    8. Dim prog As Process = New Process
    9. prog.StartInfo.FileName = Application.StartupPath & "\Converter\ffmpeg.exe"
    10. prog.StartInfo.Arguments = ("-i " & Chr(34) & "video.flv" & Chr(34) & " -ab 160000 -acodec libmp3lame " & Chr(34) & "kakakak.mp3" & Chr(34))
    11. prog.StartInfo.UseShellExecute = False
    12. prog.StartInfo.RedirectStandardOutput = True
    13. prog.StartInfo.CreateNoWindow = True
    14. prog.Start()
    15. 'prog.WaitForExit()
    16. Dim dieZeile As String
    17. Dim reader As StreamReader = prog.StandardOutput
    18. Do While prog.HasExited = True
    19. Application.DoEvents()
    20. dieZeile = reader.ReadLine
    21. Me.Text = dieZeile
    22. Loop
    wird das

    dieZeile = reader.ReadLine

    nicht erst ausgeführt nachdem das prog bereits geschlossen wurde?

    ich würde es einfach die ganze zeit abfragen und wenn das programm goschlossen wird hast du die letzte ausgabe noch drin

    VB.NET-Quellcode

    1. Do While prog.HasExited = false
    2. Application.DoEvents()
    3. dieZeile = reader.ReadLine
    4. Loop
    5. Me.Text = dieZeile

    OS: Linux Peppermint & Windows 7
    Processor: AMD Phenom II X6 1055T @ 3.5 GHz
    RAM: 8 GB Kingston ValueRAM
    GFX: NVIDIA GeForce 210
    Funktioniert's so:

    VB.NET-Quellcode

    1. While Not prog.HasExited
    2. TextBox1.Text = reader.ReadLine()
    3. TextBox1.Refresh()
    4. End While
    ?
    Was soll denn das für ein Text sein, den Du da einliest?
    Leite doch den Standard-Output von dem Process in eine TextBox um.
    Such mal nach Process.StandardOutput bzw. StandardOutput umleiten.
    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!
    Vielleicht in einem extra Thread in einer While-Schleife immer die aktuelle Zeile auslesen? So könnte das ungefähr aussehen:

    VB.NET-Quellcode

    1. Public Class ProcessReader
    2. Public Program As System.Diagnostics.Process
    3. Public Event Update As EventHandler(Of UpdateEventArgs)
    4. Protected pRunning As Boolean
    5. Protected pThread As System.Threading.Thread
    6. Public Sub New(ByVal Program_ As Process)
    7. Program = Program_
    8. End Sub
    9. Public Sub Start()
    10. If Program Is Nothing Then Exit Sub
    11. pRunning = True
    12. pThread = New System.Threading.Thread(AddressOf Read)
    13. pThread.Start()
    14. End Sub
    15. Public Sub Stop()
    16. pRunning = False
    17. End Sub
    18. Public Sub Read()
    19. Dim Reader As System.IO.StreamReader = Program.StandardOutput
    20. While pRunning
    21. RaiseEvent Update(Me, New UpdateEventArgs(Reader.ReadLine()))
    22. End While
    23. End Sub
    24. Public Class UpdateEventArgs
    25. Inherits EventArgs
    26. Public Property Line As String
    27. Public Sub New(ByVal Line_ As String)
    28. Line = Line_
    29. End Sub
    30. Public Sub New()
    31. End Sub
    32. End Class
    33. End Class
    Dann kannst du das Ganze so einsetzen:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents PrcReader As ProcessReader
    3. Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    4. PrcReader = New ProcessReader(IrgendeinProzess)
    5. PrcReader.Start()
    6. End Sub
    7. Private Sub PrcReader_Update(ByVal sender As Object, ByVal e As ProcessReader.UpdateEventArgs) Handles PrcReader.Update
    8. Me.Invoke(Sub()
    9. ListBox1.Items.Add(e.Line)
    10. End Sub)
    11. End Sub
    12. Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.FormClosed
    13. PrcReader.Stop()
    14. End Sub
    15. End Class
    Ungestet btw. und wahrscheinlich nicht 100% sauber.

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

    Das Typargument "WindowsApplication1.ProcessReader.UpdateEventArgs_" erbt nicht vom Einschränkungstyp "System.EventArgs" bzw. implementiert diesen nicht. C:\Users\Krischkros.Krischkros-Dev\AppData\Local\Temporary Projects\WindowsApplication1\ProcessReader.vb

    Hilfe... Dieser Fehler kommt im Editor von der Klasse!

    VB.NET-Quellcode

    1. Public Event Update As EventHandler(Of UpdateEventArgs_) '<- DAS!!!


    und

    Das Schlüsselwort ist kein gültiger Bezeichner.

    VB.NET-Quellcode

    1. Public Sub Stop()'<- DAS!!


    hilfe :D
    Änder mal den Namen von Stop auf irgendwas anderes... anscheinend ist das ein Schlüsselwort, das man nicht als Name verwenden kann.
    Zu deinem anderen Problem: Habe ich oben im Code ausgebessert.
    Danke haiyyu und Dodo

    Mein Fehler jetzt ist der -> StandardOut wurde nicht umgeleitet, oder der Prozess wurde noch nicht gestartet.

    Mein Code:

    VB.NET-Quellcode

    1. Private WithEvents PrcReader As ProcessReader
    2. Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    3. End Sub
    4. Private Sub PrcReader_Update(ByVal sender As Object, ByVal e As ProcessReader.UpdateEventArgs) Handles PrcReader.Update
    5. Me.Invoke(Sub()
    6. ListBox1.Items.Add(e.Line)
    7. End Sub)
    8. End Sub
    9. Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.FormClosed
    10. PrcReader.Stop()
    11. End Sub
    12. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    13. Dim ffmpeg As New Process
    14. ffmpeg.StartInfo.FileName = Application.StartupPath & "\Converter\ffmpeg.exe"
    15. ffmpeg.StartInfo.CreateNoWindow = True
    16. ffmpeg.StartInfo.UseShellExecute = False
    17. ffmpeg.StartInfo.RedirectStandardError = True
    18. Dim input As String = "1.flv"
    19. Dim output As String = Application.StartupPath & "\1.mp3"
    20. ffmpeg.StartInfo.Arguments = ("-i 1.flv" & Chr(34) & " -ab 160000 -acodec libmp3lame 1.mp3" & Chr(34))
    21. PrcReader = New ProcessReader(ffmpeg)
    22. ffmpeg.Start()
    23. PrcReader.Start()
    24. End Sub


    Fehler tritt hier auf:

    VB.NET-Quellcode

    1. Dim Reader As System.IO.StreamReader = Program.StandardOutput

    also ->

    VB.NET-Quellcode

    1. Public Sub Read()
    2. Dim Reader As System.IO.StreamReader = Program.StandardOutput
    3. While pRunning
    4. RaiseEvent Update(Me, New UpdateEventArgs(Reader.ReadLine()))
    5. End While
    6. End Sub

    VB.NET-Quellcode

    1. ffmpeg.StartInfo.RedirectStandardOutput = True
    Wenn du schon dasselbe für StandardError da stehen hast, dann wirst du wohl wissen, dass es so auch für StandardOutput geht.
    Bisschen mitdenken. :)