我有一个只有一种形式的程序。通过按下一个按钮,它开始一个 ffmpeg 转换。
在主窗体中,在文本框中,输出 ffmpeg 统计信息。这可以通过从 ffmpeg 获取 StandardError 输出来实现。
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
还是必须指定这个key被发送到当前正在运行的Process?