VB.NET根据请求创建新进程

时间:2015-03-29 12:31:47

标签: vb.net visual-studio-2012 process undefined createprocess

我有一个问题是用函数创建未定义的进程数。

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。

是否可以从流程的句柄中获得标准错误?

1 个答案:

答案 0 :(得分:0)

首先,您应该启用Option Strict以避免某些类型的错误。

你真的不需要一个名字,我把它称为一个变量,但你确实想要保留Process引用,这样你就可以在它完成后处理它并读取StdErr和StdOut。

如果您计划处理StdOut,则需要在事件中添加处理程序,然后添加一些代码来处理它。使用ErrorDataReceived

的处理程序对StdErr执行相同操作
' 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,如果由于某种原因失败,则返回ProcessNothing。作为一个功能:

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