表单 GUI 视频线程通信

本文关键字:通信 线程 视频 GUI 表单 | 更新日期: 2023-09-27 18:21:03

我正在以 C# 形式创建自定义视频播放器。目前,播放器具有初始化和关闭例程,并在后台运行读取视频帧并显示它们的线程。我对 C# 相当陌生,所以我正在尝试确定如何最好地将启动''停止''暂停命令从 GUI 线程发送到视频线程。我是否应该只使用受锁保护的状态变量,并在每次围绕我的视频线程轮询它;有吗还有其他建议吗?

谢谢。

表单 GUI 视频线程通信

询状态变量似乎是最简单的解决方案,只要您的视频线程循环足够规律。

您甚至可能不需要锁,只要只有一个线程更新它,就可以在 C# 中使状态变量volatile就足够了。( C# 中的volatile语义与 C 略有不同,应保证其他线程获取新值(

有几种方法。由于您不熟悉 C#,并且可能与 UI 紧密耦合,因此我建议您使用 BackgroundWorker 类。

http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95(.aspx

您可以使用 DoWorkEventArgs of DoWork 事件传递参数。同样,使用这种方法并且没有共享对象(通过线程(,您可以避免使用锁定或同步

我认为这可能是您最好的解决方案,但还有其他选择。您可以使用异步编程模型 (APM(,甚至可以使用线程/线程池或任务并行库。

我是否应该只使用受锁保护的状态变量,并在每次轮询我的>>视频线程时轮询它;还有其他建议吗?

如果您具有像视频线程这样的共享状态,则应使用线程同步。因此,答案将是肯定的,您应该使用一些受保护的变量,您可以通过仅使用易失性来避免锁定,但请考虑使用其他同步原语。因为使用 volatile 只是确保您正在读取/写入大多数实际值,但它不会阻止其他线程读取/写入。

一些链接可以选择是使用lock(其他原语(还是仅使用易失性:

C# 中访问简单布尔标志时,是否需要锁定或标记为易失性?

易失性 vs. 互锁 vs. 锁定

您应该能够不受限制地调用 DirectShow 筛选器图的开始/停止/暂停。这将导致对源筛选器进行相应的方法调用(有关详细信息,请参阅筛选器状态(。源筛选器确实需要通知后台线程有关状态更改的信息(如果尚未执行此操作(。

同步的实现方式与 DirectShow 类中的同步方式相同,其中筛选器中使用了两个 AutoResetEvent 实例,一个用于通知后台线程有关新请求的信息,另一个用于通知调用线程有关请求处理已完成的信息。