2015-02-01 4 views
1

У меня есть программа только с одной формой. Нажав кнопку, вы начинаете преобразование ffmpeg.VB.NET: Как поддерживать управление основной формой во время циклов в других разделах?

В основной форме, в текстовом поле, выводится статистика ffmpeg. Это возможно, если вы выберете файл StandardError из ffmpeg.

Public Sub Console() 
     Dim Process As New Process 

     Process.StartInfo.UseShellExecute = False 
     Process.StartInfo.RedirectStandardError = True 
     Process.StartInfo.RedirectStandardOutput = True 
     Process.StartInfo.FileName = current_ffmpeg_path 
     Process.StartInfo.Arguments = input_params 
     Process.StartInfo.CreateNoWindow = True 
     Process.Start() 

     Dim ffmpeg_stats_output As System.IO.StreamReader = Process.StandardError 

     Do While Process.HasExited = False 
     [update all main form textboxes by taking input string from ffmpeg and elaborate it] 
     Loop 
End Sub 

Проблема заключается в том, что в то время как этот цикл выполняется в текстовых полях и прогресс бар обновляется, но основная форма не может быть изменена. Пользователь фактически не контролирует пользователя. Поэтому, если я хочу сделать кнопку, чтобы остановить/приостановить ffmpeg в основной форме, это не может быть нажато, как что-либо еще в основной форме.

есть способ поддерживать петли внутри другого Sub без свободного управления основной формой во время работы?

Я попытался исправить это, вызвав другую форму диалога с текстовыми полями и индикатором выполнения. Но даже эта форма полностью контролируется, пока процесс не завершится.

Для отправки паузы/остановкой преобразования в FFmpeg (который работает без окна) это правильное использование:

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click 
SendKeys.Send("q") 
SendKeys.Send("^s") 
End Sub 

или должны быть указано, что этот ключ посылается к текущему запущенному процессу?

+0

Вы делаете While While замыкает изменения в пользовательском интерфейсе. запустите его как фоновый рабочий – Plutonix

+0

ok Я не настолько квалифицирован с vb.net, как перемещать только этот цикл в фоновый рабочий .. и как передавать переменные? и ... о sendkey для ffmpeg? –

+1

Одно место для запуска: [BackgroundWorker] (https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker%28v=vs.110%29.aspx) –

ответ

1

решить проблему без контроля на главном окне ...

просто использовать BackgroundWorker.