vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Kommandozeilenprogramm ausführen und Ausgabe live auslesen 
Autor: igor.sm
Datum: 07.12.07 15:32

Hi!

Die überschrift sagt eigentlich schon was ich versuchen will... Ich habe das Programm "ffmpeg.exe", ein Kommandozeilen-Videodecoder. Wenn ich nun folgenden Code ausführe, tut FFMPEG was es soll, ich kann aber die Ausgabe nicht liive auslesen...

 
          Dim p As new Process
        p.StartInfo.FileName = "ffmpeg.exe"
 
        p.StartInfo.Arguments = "-i test.mpeg test.flv"
        p.StartInfo.UseShellExecute = False
        p.StartInfo.RedirectStandardOutput = True
        p.StartInfo.CreateNoWindow = True
        Dim sOutput As String
        p.Start()
        sOutput = p.StandardOutput.ReadToEnd()
        p.WaitForExit()
        p.Close()
        MsgBox(sOutput)
dann hier mein Versuch das ganze Live auszulesen:

 Dim p As new Process
        p.StartInfo.FileName = "ffmpeg.exe"
 
        p.StartInfo.Arguments = "-i test.mpeg test.flv"
        p.StartInfo.UseShellExecute = False
        p.StartInfo.RedirectStandardOutput = True
        p.StartInfo.CreateNoWindow = True
        Dim sOutput As String
        p.Start()
        Do                    'Schleife
            sOutput = p.StandardOutput.ReadToEnd   'lese aus
            textbox1.text = sOutput                                      _
              'setzte Textbox text auf ausgelesenes
 
            System.Threading.Thread.Sleep(50)              'Lasse Programm kurz 
            ' luftholen
            My.Application.DoEvents()                                'UI aktiv 
            ' halten
            If p.HasExited Then                                             _
              'Wenn Programm zu dann raus aus der Schleife...
                Exit Do
            End If
        Loop
        p.Close()
        ' MsgBox(sOutput)
Da Passiert dann rein gar nichts. FFmpeg berechnet trotzdem die richtige Datei, ich bekomme halt nur keine Ausgabe...

Weiß da jemand Hilfe?

Igor

I dream of gardens in the desert sand...

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kommandozeilenprogramm ausführen und Ausgabe live auslesen 
Autor: Maywood
Datum: 07.12.07 16:57

Such am besten mal nach "Process OutputDataReceived".

Hier ein Beispiel:
	Sub Test()
		  Dim p As New Process 
		  AddHandler p.OutputDataReceived, AddressOf ProcessOutputDataReceived
        p.StartInfo.FileName = "ping.exe"
        p.StartInfo.Arguments = "-t vbarchiv.de"
        p.StartInfo.UseShellExecute = False
        p.StartInfo.RedirectStandardOutput = True
        p.Start()
        p.BeginOutputReadLine()
        p.WaitForExit()
	End Sub
 
	Private Sub ProcessOutputDataReceived(sender As Object, e As _
  DataReceivedEventArgs) 
		Console.WriteLine ( e.Data )
	End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kommandozeilenprogramm ausführen und Ausgabe live auslesen 
Autor: igor.sm
Datum: 08.12.07 21:25

hi!

Danke für die schnelle Antwort...

mir dem Ping-Befehl klappt alles Problemlos... wenn ich jetzt aber den code für ffmpeg abändere bleibt meine textbox leer... ich denke das liegt daran, dass die Ausgabe von der Kommandozeile nicht immer eine neue Zeile dazumacht, sondern die schon stehende Ausgabezeile ändert... (ob das jetzt jemand versteht )

 Private Sub backgroundwEncode_DoWork(ByVal sender As System.Object, ByVal e As _
   System.ComponentModel.DoWorkEventArgs) Handles backgroundwEncode.DoWork
        Dim p As New Process
        AddHandler p.OutputDataReceived, AddressOf ProcessOutputDataReceived
        p.StartInfo.FileName = "ffmpeg.exe"
        p.StartInfo.Arguments = "-i test.flv test.mpg"
        p.StartInfo.UseShellExecute = False
        p.StartInfo.RedirectStandardOutput = True
        p.StartInfo.CreateNoWindow = True
        p.Start()
        p.BeginOutputReadLine()
        p.WaitForExit()
    End Sub
    Private Sub ProcessOutputDataReceived(ByVal sender As Object, ByVal e As _
      DataReceivedEventArgs)
        If e.Data = "" Then
        Else
            ausgabe = ausgabe & vbNewLine & (e.Data)
        End If
    End Sub
 
    Private Sub timer_encodingfortschritt_Tick(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles timer_encodingfortschritt.Tick
        Dim temp As String = ausgabe
        TextBox1.Text = temp
    End Sub
Igor

I dream of gardens in the desert sand...

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Kommandozeilenprogramm ausführen und Ausgabe live auslesen 
Autor: Maywood
Datum: 10.12.07 12:58

Okay. Nur, warum und wieso benützt du hierfür ein Timer? Wenn du es wirklich ordentlich machen möchtest, dann verwende lieber Delegates / EventHandler:
	Delegate Sub UpdateTextBoxTextDelegate(text As String)
 
	Sub Button1Click(ByVal sender As Object, ByVal e As EventArgs)
		Test()
	End Sub
 
	Sub Test()
		With New Process() 
			AddHandler .OutputDataReceived, AddressOf ProcessOutputDataReceived
	        .StartInfo.FileName = "ping.exe"
	        .StartInfo.Arguments = "-t vbarchiv.de"
	        .StartInfo.UseShellExecute = False
	        .StartInfo.RedirectStandardOutput = True
	        .StartInfo.CreateNoWindow = True
	        .StartInfo.WindowStyle = ProcessWindowStyle.Hidden
	        .Start()
	        .BeginOutputReadLine()
		End With
	End Sub
 
	Private Sub UpdateTextBoxText ( text As String ) 
		#if DEBUG then
			Debug.WriteLine ( text )
		#endif
		If Me.checkBox1.Checked Then '// Append text
			me.textBox1.AppendText ( text + Environment.NewLine )
		Else
			me.textBox1.Text = text
		End If
	End Sub
 
	Private Sub ProcessOutputDataReceived(sender As Object, e As _
  DataReceivedEventArgs) 
		If Not String.IsNullOrEmpty ( e.Data ) Then
			Me.Invoke ( New UpdateTextBoxTextDelegate (AddressOf UpdateTextBoxText), New _
  Object () { e.Data })				
		End If
	End Sub
>> dass die Ausgabe von der Kommandozeile nicht immer eine neue Zeile dazumacht, sondern die schon stehende Ausgabezeile ändert... (ob das jetzt jemand versteht )

So ungewöhnlich ist das nicht. Nicht alle Programme erzeugen für Ihre Ausgabe eine neue Zeile...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel