Я создаю программу, которая открывает ffmpeg и запускает задание, которое затем пользователь может завершить, нажав кнопку.
Я получаю "Операция асинхронного чтения уже запущенапоток."на «BeginOutputReadLine», когда я пытаюсь выйти из задания второй раз.
Если я пытаюсь поместить «Dim p3 As New Process» внутри «test_run ()», я получаю: «StandardIn не было перенаправлено».на "StandardInput.WriteLine", если я попытаюсь выйти из задания один раз.
Это рабочий пример моего кода.
Imports System.IO
Public Class Form1
Dim quote As String = """"
Dim p3 As New Process
Function generate_batch(aargs As String) As Integer
Dim sb As New System.Text.StringBuilder
sb.AppendLine("@echo off")
sb.AppendLine("CD " + quote + Application.StartupPath + quote)
sb.AppendLine("ffmpeg " + aargs)
sb.AppendLine("(goto) 2>nul & del " + quote + "%~f0" + quote)
IO.File.WriteAllText(Path.GetTempPath + "ffmpeg.bat", sb.ToString())
End Function
Private Sub test_run()
If TextBox1.Text = "1" Then
p3.StandardInput.WriteLine("q")
p3.Close()
Else
generate_batch(arg.Text)
With p3.StartInfo
.FileName = Path.GetTempPath + "\ffmpeg.bat"
.CreateNoWindow = True
.RedirectStandardOutput = True
.RedirectStandardError = True
.RedirectStandardInput = True
.UseShellExecute = False
End With
AddHandler p3.OutputDataReceived, AddressOf consoleOutputHandler
AddHandler p3.ErrorDataReceived, AddressOf consoleErrorHandler
p3.Start()
p3.BeginOutputReadLine()
p3.BeginErrorReadLine()
End If
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
test_run()
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
TextBox1.Text = "1"
test_run()
End Sub
'///////////////////
'/ Standard Output /
'///////////////////
Private Delegate Sub consoleOutputDelegate(ByVal outputString As String)
Private Sub consoleOutput(ByVal outputString As String)
'Invoke the sub to allow cross thread calls to pass safely
If Me.InvokeRequired Then
Dim del As New consoleOutputDelegate(AddressOf consoleOutput)
Dim args As Object() = {outputString}
Me.Invoke(del, args)
Else
'Now we can update your textbox with the data passed from the asynchronous thread
RichTextBox1.AppendText(String.Concat("", outputString, Environment.NewLine))
End If
End Sub
'Catch the Standard Output
Sub consoleOutputHandler(ByVal sendingProcess As Object, ByVal outLine As DataReceivedEventArgs)
If Not String.IsNullOrEmpty(outLine.Data) Then
'If the Current output line is not empty then pass it back to your main thread (Form1)
consoleOutput(outLine.Data)
End If
End Sub
'///////////////////
'// Error Output ///
'///////////////////
Private Delegate Sub consoleErrorDelegate(ByVal errorString As String)
Private Sub consoleError(ByVal errorString As String)
'Invoke the sub to allow cross thread calls to pass safely
If Me.InvokeRequired Then
Dim del As New consoleErrorDelegate(AddressOf consoleError)
Dim args As Object() = {errorString}
Me.Invoke(del, args)
Else
'Now we can update your textbox with the data passed from the asynchronous thread
RichTextBox1.AppendText(String.Concat("", errorString, Environment.NewLine))
End If
End Sub
'Catch the Error Output
Private Sub consoleErrorHandler(ByVal sendingProcess As Object, ByVal errLine As DataReceivedEventArgs)
If Not String.IsNullOrEmpty(errLine.Data) Then
'If the Current error line is not empty then pass it back to your main thread (Form1)
consoleError(errLine.Data)
End If
End Sub
End Class
Что находится внутри "arg.text"
-re -i video.mp4 -c copy -f rtp_mpegts rtp://127.0.0.1:10000?pkt_size=1316
Я ожидаю, что работу можно будет останавливать и запускать неограниченное количество раз, но я продолжаю сталкиваться с проблемами и не знаю почему.
Мне интересно, есть ли у меняостановить асинхронное чтение, но я не знаю, возможно ли это.