我使用DirectShowNet,当我的Graph停止时,我释放了com对象。
问题在于,当我尝试释放COM对象[过滤器,接口]时,有时这种清理导致directshow图形没有停止。它"暂停"。
如果我没有搞清楚[释放com对象] everthing就可以了[除了我有内存泄漏] ...
以下是我如何清理:
if (videoWindow != nullptr)
{
Marshal::ReleaseComObject(videoWindow);
videoWindow = nullptr;
}
if (mediaControl != nullptr)
{
Marshal::ReleaseComObject(mediaControl);
mediaControl = nullptr;
}
if (graphBuilder != nullptr)
{
Marshal::ReleaseComObject(graphBuilder);
graphBuilder = nullptr;
}
...
可能有什么问题?我是否以错误的方式重新过滤?什么可能导致这个"无法停止的图表"?
答案 0 :(得分:2)
你没有提到究竟是什么叫停止(冻结)以及什么是调用堆栈。
典型的情况是,错误的过滤器,或者它可能是带有错误回调的Sample Grabber
过滤器,无法同步它接收停止请求的“主”线程,以及工作线程或工作者活动在后台线程上,最终锁死了。您应该能够通过检查调试器下的线程状态来识别损坏的组件。
将问题隔离到特定过滤器的另一种方法是暂时从管道中删除某些片段,并找出添加/删除哪个片段导致问题。