表格GUI视频线程通信

时间:2012-01-23 11:04:15

标签: c# multithreading forms user-interface

我正在以C#形式创建自定义视频播放器。目前,播放器具有初始化和关闭例程以及在后台运行的线程读取视频帧并显示它们。我对C#相当新,所以我试图确定如何最好地将start \ stop \ pause命令从GUI线程发送到视频线程。我应该只使用一个受锁保护的状态变量,每次绕过我的视频线程进行轮询;在那儿 还有其他建议吗?

感谢。

3 个答案:

答案 0 :(得分:1)

轮询状态变量似乎是最容易定期提供视频线程循环的解决方案。

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

答案 1 :(得分:0)

有几种方法可行。由于您是C#的新手并且可能与UI紧密耦合,我建议您使用BackgroundWorker类。

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

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

我认为它可能是最适合您的解决方案,但也有其他选择。您可以使用Asynchronouse编程模型(APM),甚至是Thread / ThreadPool或任务并行库。

  
    

我应该只使用一个受锁保护的状态变量,每次围绕我的>>视频线程进行轮询;还有其他建议吗?

  

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

一些链接选择是使用锁定(其他原语)还是仅使用volatile:

Do I need to lock or mark as volatile when accessing a simple boolean flag in C#?

Volatile vs. Interlocked vs. lock

答案 2 :(得分:0)

您应该能够无限制地调用DirectShow过滤器图形的开始/停止/暂停。这将导致源过滤器上的相应方法调用(有关更多信息,请参阅Filter States)。如果尚未完成此操作,源过滤器确实需要通知后台线程有关状态更改的信息。

同步可以以与DirectShow类相同的方式实现,其中在过滤器中使用两个AutoResetEvent实例,一个用于通知后台线程有关新请求,另一个用于通知调用线程有关请求处理完成。

相关问题