1

我有一个只有一种形式的程序。通过按下一个按钮,它开始一个 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?

4

1 回答 1

1

解决了主窗口无法控制的问题...

只需使用 BackgroundWorker。

于 2015-02-03T12:54:21.450 回答