2011-12-24 1 views
0

私は、DSPACKコンポーネントライブラリを使用するDelphi 6 DirectShowプッシュソースビデオフィルタを用意しています。特定の操作を実行する前にフィルターのどの部分をフィルター状態にロックする必要がありますか?たとえば、私のフィルタのFillBuffer()メソッドでは、ビットマップキャンバスを書き込む前にフィルタの共有状態をロックする必要がありますか?または、共有状態をロックする必要があるフィルタピンの接続/切断イベントやメディア形式のネゴシエーションなどの操作だけですか?DirectShowフィルタの共有状態をロックすることについて、いつ心配する必要がありますか?

答えて

2

アトミック操作を確実にするために、フィルタをロックします(フィルタ固有ではなく、マルチスレッド環境の任意のオブジェクトに適用されます)。通常は、データアクセスまたはアクションのシリアライズのいずれかです。

たとえば、CTransformFilterクラスには、2つのクリティカルセクション、m_csFilterおよびm_csReceiveがあります。

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

操作が並行スレッドのアクションによって中断されないようにする必要がある場合は、フィルター状態をロックする必要があります。あなたのロックが他のスレッドを遅らせる可能性があるので、あなたは...他のスレッド上で可能な実行など、わずかに影響を与えるために、ロックに

+0

[OK]を感謝し、最小限の時間を保持することが期待されています。私は、特定の重要な操作が進行中であることを私のコード外のレイヤーでDirectShowに伝える必要がある「特別な」セマフォーかもしれないと考えました。それはちょうど標準的な同期シナリオであるあなたの説明のように聞こえる。 –

関連する問題