VB.NET: Как сохранить основной контроль формы во время циклов в других подпрограммах?
У меня есть программа только с одной формой. Нажатием кнопки запускается преобразование ffmpeg.
В основной форме, в текстовых полях, выводится статистика 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
или должно быть указано, что этот ключ отправляется текущему запущенному процессу?
1 ответ
Решил проблему без контроля над главным окном...
просто используйте BackgroundWorker.