次の方法で共有


ストリーミング スレッドとフィルター グラフ マネージャー

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]

フィルター グラフ マネージャーは、グラフを停止すると、すべてのストリーミング スレッドがシャットダウンされるまで待機します。 これには、フィルターに対して次の影響があります。

  • フィルターは、ストリーミング スレッドから Filter Graph Manager のメソッドを呼び出してはなりません。

    Filter Graph Manager では、クリティカル セクションを使用して独自の操作を同期します。 ストリーミング スレッドがこの重要なセクションを保持しようとすると、デッドロックが発生する可能性があります。 例: 別のスレッドがグラフを停止するとします。 そのスレッドはフィルター グラフロックを受け取り、フィルターがデータの配信を停止するのを待ちます。 フィルターがロックを待機している場合は停止せず、デッドロックが発生します。

  • フィルターは、ストリーミング スレッドからフィルター グラフ マネージャーを AddRef または QueryInterface にしないでください。

    フィルターがフィルター グラフ マネージャーの参照カウントを保持している場合 ( AddRef または QueryInterface を使用)、参照カウントを保持する最後のオブジェクトになる可能性があります。 フィルターが Release を呼び出すと、フィルター グラフ マネージャーはそれ自体を破棄します。 フィルター グラフ マネージャーは、クリーンアップ ルーチン内でグラフの停止を試み、ストリーミング スレッドが終了するまで待機します。 ただし、ストリーミング スレッド内で待機しているため、ストリーミング スレッドは終了できません。 その結果、デッドロックが発生します。