【问题标题】:Clean up DirectShow Graph - DirectShow graph is not stopping清理 DirectShow 图形 - DirectShow 图形没有停止
【发布时间】:2012-03-20 18:28:49
【问题描述】:

我使用 DirectShowNet,当我的 Graph 停止时,我会释放 com 对象。

问题是,当我尝试释放 COM 对象 [过滤器,接口] 时,有时这种清理会导致 directshow graph not STOPPED.It “suspend”。

如果我不整理 [释放 com 对象] 一切都可以 [除了我有内存泄漏] ...

以下是我的清理方法:

if (videoWindow != nullptr) 
{
    Marshal::ReleaseComObject(videoWindow);
    videoWindow = nullptr;

}

if (mediaControl != nullptr) 
{
    Marshal::ReleaseComObject(mediaControl);
    mediaControl = nullptr;             
}


if (graphBuilder != nullptr)
{
   Marshal::ReleaseComObject(graphBuilder);
   graphBuilder = nullptr;

}

....

可能有什么问题?我是否以错误的方式释放过滤器?什么可能导致这个“不可阻挡的图表”?

【问题讨论】:

    标签: directshow directshow.net


    【解决方案1】:

    您没有提到确切的调用停止(冻结)以及调用堆栈是什么。

    这是一个典型的场景,一个错误的过滤器,或者它可能是一个带有错误回调的Sample Grabber过滤器,无法同步它接收停止请求的“主”线程,以及后台的工作线程或工作活动线程,并最终锁死。您应该能够通过在调试器下检查线程状态来识别损坏的组件。

    将问题隔离到特定过滤器的另一种方法是暂时从管道中删除某些片段,并找出添加/删除哪个片段会导致问题。

    【讨论】:

    • 似乎较旧的解码器过滤器 [ffdshow] 会导致此问题。[它不会自行破坏]。我更新了解码器过滤器,现在它关闭了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    相关资源
    最近更新 更多