0

у меня есть задача создать неопределенное количество процессов с функцией ..VB.NET создавать новые процессы по запросу

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 до нескольких раз в зависимости от выбранных элементов ListView, так Мне нужно другое имя для каждого процесса.

для каждого процесса мне нужно иметь:

1.name нового созданного процесса (я должен прочитать стандартную ошибку от процесса). 2. Обработан новый процесс.

P.S.

можно получить стандартную ошибку от ручки процесса?

ответ

0

Во-первых, вы должны включить Option Strict, чтобы избежать определенных ошибок.

Вам действительно не нужно имя, с помощью которого я воспринимаю его как переменную, но вы хотите сохранить ссылку на Process, чтобы вы могли избавиться от нее, когда это будет сделано, и прочитать StdErr и StdOut.

Если вы планируете обрабатывать StdOut, вам необходимо добавить обработчик, а затем код в случае его обработки. Сделайте то же самое для Stderr с помощью обработчика ErrorDataReceived

' a collection of the jobs 
Private jobs As New List(Of Process) 

Тогда ваш Создатель работы может вернуть новый процесс или хранить его в самом списке.

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/Поймать в создателя и построить его в качестве 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 
+0

Я думаю, что это будет сделано ... Другой вопрос ... Может быть, я могу использовать словарь, чтобы иметь ссылку имени –

Смежные вопросы