2012-01-23 5 views
4

私はC#形式でカスタムビデオプレーヤーを作成しています。現在のところ、プレイヤーには初期化およびシャットダウンルーチンがあり、バックグラウンドでビデオフレームを読み込んで表示するスレッドがあります。私はC#をかなり新しくしているので、GUIスレッドからstart \ stop \ pauseコマンドをビデオスレッドに送信するにはどうすればよいかを確認しようとしています。私はちょうどロックで保護された状態変数を使用し、私のビデオスレッドのたびにこれをポーリングする必要があります。その他の推奨事項はありますか? フォームGUIビデオスレッド通信

ありがとうございました。

+0

フレームはどのようにシステムに流れますか?スレッドはビデオフレームオブジェクトを作成し、入ってくるストリームをデコードしてGUIにBeginInvokeしますか? –

+0

非UIスレッドでカスタムDirectShowプッシュソースフィルタにコピーされました。 – integra753

+0

DirectShowに固有の場合は、タグを追加する必要があります。 –

答えて

1

ポーリングされた状態変数は、ビデオスレッドループを定期的に十分に提供する最も簡単なソリューションと思われます。

ロックを必要としない場合もあります。ステート変数volatileは、1つのスレッドのみがそれを更新すれば十分です。 (C#のvolatileはCとわずかに異なるセマンティクスを持ち、他のスレッドが新しい値を受け取ることを保証する必要があります)

+0

最後に、私はstartStep/Stop/PauseでcurrentStateとnextStateのvaraiblesをgaurdsと一緒に使用しているため、正しい時刻にのみ起動されます。コード化されている方法は、ロックを必要としません(これはいいです)。 – integra753

0

いくつかの方法があります。 C#の初心者であり、おそらくUIに密接に関連しているので、BackgroundWorkerクラスを使用することをお勧めします。

http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

あなたはDoWorkイベントのDoWorkEventArgsを使用して引数を渡すことができます。 また、このようなアプローチでは、スレッド(スレッド)を使用しない共有オブジェクトを使用しないで、ロックや同期の使用を避けることができます。

私はそれがあなたにとって最適な解決策かもしれないと思います。 Asynchronouse Programming Model(APM)、またはThread/ThreadPool、またはTask Parallel Libraryを使用することができます。

私はロックで保護された状態変数を使用して、この私の>>ビデオスレッドラウンドごとにポーリングする必要があります。その他の推奨事項はありますか?

あなたがスレッドの同期を使用する必要がありますよりも、ビデオ・スレッドのような状態を共有している場合。したがって、答えははいです。保護された変数を使用する必要があります。揮発性を使用してロックを回避できますが、他の同期プリミティブを使用することを検討してください。 volatileを使うと、実際の値を読み書きしていることが保証されますが、他のスレッドが読み書きすることはできません。

ロック(他のプリミティブ)を使用するかどうかを選択するために、いくつかのリンクか、単に揮発性:

Do I need to lock or mark as volatile when accessing a simple boolean flag in C#?

​​

+0

DoWorkEventArgsは、最初だけ渡されます。彼は実行中スレッドに状態を渡す必要があります。 – GazTheDestroyer

+0

共有状態とスレッドの同期よりも優れています。私は自分の答えを更新する – Regfor

0

あなたは/起動/停止を呼び出すのDirectShowフィルタグラフを一時停止することができるはずです制限なし。これにより、ソースフィルタでそれぞれのメソッド呼び出しが発生します(詳細はFilter Statesを参照)。これがまだ行われていない場合、ソースフィルタはバックグラウンドスレッドに状態変更について通知する必要があります。

同期は、フィルタで2つのAutoResetEventインスタンスが使用されるDirectShowクラスと同じ方法で実装できます.1つはバックグラウンドスレッドに新しい要求を通知するメソッドで、もう1つは要求処理が完了したことを呼び出しスレッドに通知するメソッドです。

関連する問題