我有一个在 Google 中似乎很常见的问题,但对我没有帮助。当我的应用程序试图关闭所有内容时,释放对象之前调用的最后一个函数是 IMediaControl::stop。有信号时一切正常。但是当我在没有信号的情况下启动应用程序(或在应用程序工作时终止它)程序永远不会从 stop() 返回。更重要的是,如果我在信号已经挂起时提供信号,一切都会恢复正常,程序会取消挂起并正确退出。
这是我的主要代码的一部分:
hr = connectFilters(pGraph, pCaptureDevice, AUDIO_INPUT_DEVICE_PIN_NAME,
pAnalyzerFilter, SPDIF_ANAL_FILTER_PIN_NAME);
if(SUCCEEDED(hr))
{
// run the graph
hr = pControl->Run();
if(SUCCEEDED(hr))
{
// wait for UI thread to finish
pFilterObject->WaitForThread();
// stop the graph and exit
pControl->Stop();
}
}
releaseObjects();
return 0;
谷歌建议死锁(确实是这样)是由一些线程相互等待引起的。UI线程似乎不是问题,因为我在没有Window的情况下基于这个应用程序做了一个DLL,问题是一样的。
非常感谢提前,
蚀
编辑:
我只有两个过滤器:源和转换。问题肯定在变换过滤器中,因为没有它程序运行良好。可能是某处未释放缓冲区或样本的问题吗?我不知道 DirectShow 是如何工作的,但是如果没有信号,可能需要做一些额外的事情?
编辑 2:
我在 Google 中发现有人通过在停止图表之前停止源过滤器解决了这个问题。我做了同样的事情,它也挂起......我用它来获取源过滤器:
hr = pFG2->AddSourceFilterForMoniker(pMoniker, pContext, wszName, &pSource);
*ppF = pSource;
(*ppF)->AddRef();
当我附加 VS 调试器时,它说它无法显示代码,所以我认为它在 MS 代码中的某个地方。即使我评论我的函数处理 IMediaSamples 它仍然挂起。现在我已经没有什么想法了。我还尝试以不同的方式从图表中停止和删除过滤器。