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;
Google は、いくつかのスレッドが互いに待機していることが原因でデッドロックが発生したことを示唆しています (実際にそうです)。ウィンドウなしでこのアプリに基づいて DLL を実行したため、UI スレッドは問題ではないようですが、問題はまったく同じです。
よろしくお願いします。
日食
編集:
ソースと変換の 2 つのフィルターしかありません。プログラムはそれなしで正常に実行されるため、問題は確かに変換フィルターにあります。リリースされていないバッファまたはサンプルがどこかにあるという問題でしょうか? DirectShow がどのように機能するのか正確にはわかりませんが、信号がない場合は何か追加の操作が必要になるのでしょうか?
編集2:
Google で、誰かがグラフを停止する前にソース フィルターを停止することでこの問題を解決したことがわかりました。私は同じことをしましたが、それもハングします...これを使用してソースフィルターを取得します。
hr = pFG2->AddSourceFilterForMoniker(pMoniker, pContext, wszName, &pSource);
*ppF = pSource;
(*ppF)->AddRef();
VSデバッガーをアタッチすると、コードを表示できないと表示されるので、MSコードのどこかにあると思います。IMediaSamples を処理する関数にコメントを付けても、ハングします。今、私は何が悪いのかという考えを使い果たしました。また、さまざまな方法でフィルターを停止してグラフから削除しようとしました。