2017-06-04 14 views
0

フレームをキューにプッシュし、別のスレッドを使用して処理しますが、常に「プッシュフレームスレッド」で実行します。フレームをキュー単位で処理する方法は?

VideoSource.NewFrame += VideoSource_NewFrame; 
private void VideoSource_NewFrame(object sender, NewFrameEventArgs eventArgs) 
{ 
    var bitmap = (Bitmap)eventArgs.Frame; 
    if (_fileWriter.IsOpen&&IsRecording) 
    { 
     _bitmaps.Enqueue(bitmap); 
     //Thread.Sleep(10); 
    } 
} 

私がThread.Sleep(10)を処理すると、別のスレッドが機能します。

別のスレッドコード:

new Task(() => 
{ 
    Bitmap bitmap = null; 
    while (IsRecording==true) 
    { 
     if (_bitmaps.Count == 0) 
      continue; 
     _bitmaps.TryDequeue(out bitmap); 
     if(bitmap!=null&& _fileWriter.IsOpen) 
      _fileWriter.WriteVideoFrame(bitmap); 
     if (_bitmaps.Count == 0 && IsRecording == false&&_fileWriter.IsOpen) 
     { 
      _fileWriter.Flush(); 
      _fileWriter.Close(); 
     } 
    } 
}).Start(); 

は、どのようにそれをよりエレガントな方法の契約を使用するには?

+0

"常にプッシュフレームスレッドで実行する"とはどういう意味ですか? –

+0

@Kevin Gosse:タスク中の「whileループコード」は3回以上実行されませんが、カウントはゼロではありません。 – HaibaraAi

+0

コンストラクタで 'Task'を作成しているのはなぜですか?それは悪い習慣です。 – VMAtm

答えて

0

私はちょうどこれにコードを変更します。 それは...

var bitmap = (Bitmap)eventArgs.Frame.Clone(); 
関連する問題