0

DSPACKコンポーネントライブラリを使用するDelphi6DirectShowプッシュソースビデオフィルターがあります。特定の操作を実行する前に、フィルターのどの側面でフィルターの状態をロックする必要がありますか?たとえば、フィルターのFillBuffer()メソッドでは、ビットマップキャンバスを作成する前に、フィルターの共有状態をロックする必要がありますか?それとも、共有状態をロックする必要があるのは、フィルターピンの接続/切断イベントやメディアフォーマットネゴシエーションなどの操作だけですか?

4

1 に答える 1

2

フィルタをロックして(フィルタ固有ではなく、マルチスレッド環境のすべてのオブジェクトに適用されます)、アトミック操作を保証します。これは通常、データアクセスまたはアクションのシリアル化のいずれかです。

たとえば、CTransformFilterクラスには2つのクリティカルセクションがあります:m_csFilterm_csReceive

m_csFilterデータの状態を保護して、1つのスレッドが何かを変更しているときに、他のスレッドが同じデータに同時に触れないようにします。もう1つは、m_csReceive受信イベントとストリーム終了イベントをシリアル化するために使用されます。

並行スレッドでのアクションによって操作が中断されないようにする必要がある場合は、フィルターの状態をロックする必要があります。ロックは他のスレッドを遅らせる可能性があるため、他のスレッドでの実行にできるだけ影響を与えないように、ロックを最小限の時間保持することが期待されます。

于 2011-12-24T18:38:31.830 に答える