VB.NET 根据要求创建新流程
VB.NET Create New Processes at request
我在使用函数创建未定义数量的进程时遇到问题..
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.name 创建的新进程(我必须从进程中读取标准错误)。
2.handle 个已创建的新进程。
P.S.
是否可以从进程句柄中获取标准错误?
首先,您应该启用 Option Strict 以避免某些类型的错误。
你真的不需要一个名字,我认为它是指一个变量,但你确实想保留 Process 引用,这样你就可以在它完成后处理它并读取 StdErr 和 StdOut。
如果你打算处理StdOut,你需要添加一个处理程序,然后在事件中添加一些代码来处理它。使用 ErrorDataReceived
的处理程序对 StdErr 执行相同的操作
' a collection of the jobs
Private jobs As New List(Of Process)
然后您的 Job Creator 可以 return 新流程或将其存储在列表本身中。
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
我会在 creator 中添加一个 Try/Catch 并将其构建为 Function
,其中 return 是 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
我在使用函数创建未定义数量的进程时遇到问题..
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.name 创建的新进程(我必须从进程中读取标准错误)。 2.handle 个已创建的新进程。
P.S.
是否可以从进程句柄中获取标准错误?
首先,您应该启用 Option Strict 以避免某些类型的错误。
你真的不需要一个名字,我认为它是指一个变量,但你确实想保留 Process 引用,这样你就可以在它完成后处理它并读取 StdErr 和 StdOut。
如果你打算处理StdOut,你需要添加一个处理程序,然后在事件中添加一些代码来处理它。使用 ErrorDataReceived
' a collection of the jobs
Private jobs As New List(Of Process)
然后您的 Job Creator 可以 return 新流程或将其存储在列表本身中。
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
我会在 creator 中添加一个 Try/Catch 并将其构建为 Function
,其中 return 是 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