我有一个问题是用函数创建未定义的进程数。
Function CreateJobProcess(ByVal Name, ByVal ffmpegpath, ByVal params)
Try
Dim Job As New Process
Job.StartInfo.UseShellExecute = False
Job.StartInfo.CreateNoWindow = True
Job.StartInfo.RedirectStandardError = True
Job.StartInfo.FileName = ffmpegpath
Job.StartInfo.Arguments = params
Job.Start()
Return Job.Handle
Catch ex As Exception
MsgBox(ex.Message)
End Try
Return Nothing
End Function
该函数从1到几次调用,具体取决于所选的列表视图条目,因此我需要为每个进程使用不同的名称。
我需要的每个流程:
1.创建的新进程的名称(我必须从进程中读取标准错误)。 2.创建新流程的句柄。
P.S。
是否可以从流程的句柄中获得标准错误?
答案 0 :(得分:0)
首先,您应该启用Option Strict以避免某些类型的错误。
你真的不需要一个名字,我把它称为一个变量,但你确实想要保留Process引用,这样你就可以在它完成后处理它并读取StdErr和StdOut。
如果您计划处理StdOut,则需要在事件中添加处理程序,然后添加一些代码来处理它。使用ErrorDataReceived
' a collection of the jobs
Private jobs As New List(Of Process)
然后您的Job Creator可以返回新进程或将其存储在列表中。
Private Sub CreateNewJob(ffmpegpath As String, params As String)
Dim P As New Process
With P.StartInfo
.UseShellExecute = False
.CreateNoWindow = False
.RedirectStandardOutput = True
.FileName = ffmpegpath
.Arguments = params
End With
AddHandler P.OutputDataReceived, AddressOf _OutputDataReceived
jobs.Add(P)
P.Start()
End Sub
我会在创建者中添加一个Try / Catch并将其构建为Function
,如果由于某种原因失败,则返回Process
或Nothing
。作为一个功能:
Dim p As Process = CreateNewJob("file path", "job args")
If p IsNot Nothing Then
jobs.Add(p)
End If
您没有名称,但jobs(N)
提供了参考,因此一旦完成,您就可以Dispose
jobs(N).HasExited = True
。它提供了一种简单的方法来了解您运行了多少它们,这样您就不会一次启动太多。
处理输出的事件处理程序:
Private Sub _OutputDataReceived(sender As Object,
e As DataReceivedEventArgs)
' e.Data will be the output from the child process
End Sub