我在我的C#/ WPF项目中使用DirectShowLib-2005。当相机启动时,我运行媒体控制:
m_FilterGraph = new FilterGraph() as IFilterGraph2;
/* Initializations */
IMediaControl mediaCtrl = m_FilterGraph as IMediaControl;
hr = mediaCtrl.Run();
DsError.ThrowExceptionForHR(hr);
应用程序运行,相机运行良好。但有时(并非总是)我退出应用程序冻结时。我暂停了调试器,我看到应用程序停在以下行:
if (m_FilterGraph != null)
{
IMediaControl mediaCtrl = m_FilterGraph as IMediaControl;
mediaCtrl.Stop(); // <= *** Blocked here ***
Marshal.ReleaseComObject(m_FilterGraph);
m_FilterGraph = null;
}
如何防止这种冻结?我可以添加时间或尝试/捕捉吗?
答案 0 :(得分:3)
如果你look for it,你可以找到许多讨论类似冻结症状的对话,试图阻止流式传输。
单独IMediaControl.Stop
的实施以及发布的代码片段都很好。重要的是流是多线程的,并且调用涉及与流线程的同步:发信号通知它停止并等待完成;这也涉及停止所有参与的过滤器。线程问题,任何过滤器或者 - 经常 - 从过滤器到控制代码的回调不小心忽略线程概念可能会导致死锁。
您对此问题的描述不完整。当你面临这种冻结时,你需要:
Stop
的线程(可能没有任何有意义的细节),还有其他线程,以找到阻止停止同步的其他线程问题通常是您的代码导致流式传输停止或参与过滤器的错误。