停止IMediaControl永远不会结束
本文关键字:结束 永远 IMediaControl 停止 | 更新日期: 2023-09-27 17:58:17
我的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;
}
如何防止这种冻结?我可以加一个暂停或尝试/接球吗?
如果你寻找它,你会发现周围有很多对话讨论类似的冻结症状,试图停止流媒体。
单独实现IMediaControl.Stop
以及发布的代码片段都很好。重要的是,流是多线程的,调用涉及到与流线程的同步:用信号通知它停止并等待完成;这也涉及到停止所有参与的过滤器。线程、任何筛选器的问题,甚至是从筛选器到控制代码的回调(通常忽略线程概念)都可能导致死锁。
你对问题的描述是不完整的。当你面临这种冻结时,你需要:
- 确保您了解管道的拓扑结构;您需要了解(并包括在这样的问题中)有关参与过滤器和引脚连接的详细信息
- 请确保从正确的线程停止图形,特别是从特定的筛选器回调
- 附加调试器并检查线程状态,但不仅是调用冻结
Stop
的线程(可能没有任何有意义的细节),还有其他线程,以找到阻止停止同步的其他相关线程
问题通常是您的代码在停止流时导致死锁,或者参与过滤器出现错误。
- 清理DirectShow图形-DirectShow图形未停止
- 使用CC解码器筛选器时,停止Directshow图形会冻结WinXP
- IID_IMediaControl在停止时卡住
-
IMediaControl::没有信号时停止挂起
-
IMediaControl::stop方法挂起
- IMediaControl::停止偶尔需要很长时间才能完成
- 为什么IMediaControl::Stop()挂起
- 应用程序挂起使用我的图像捕获设备调用IMediaControl::Stop()