2011-01-21 25 views
3

すべて私はWPFでカメラキャプチャフレームを表示しようとしています。私はすでに画像を表示することができます。しかし、イベント処理メソッドを把握することはできませんか? WinFormではApplication.Idleですが、WPFで何を使用する必要がありますか?私はこれを見ましたthread ..私はそれを作ることができませんでした。WPFでEMGU CVカメラキャプチャ?

答えて

4

なぜTimer.Elapsedイベントを使用できないのですか?

「失効したコールバックがワーカースレッドで発生するため、UIの更新が不可能になります。したがって、SynchronizationContextを使用してUI更新アクションを適切なスレッドに誘導する必要があります。

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     //... 
     this.Dispatcher.Hooks.DispatcherInactive += new EventHandler(Hooks_DispatcherInactive); 
    } 

    void Hooks_DispatcherInactive(object sender, EventArgs e) 
    { 
     using (Image<Bgr, byte> frame = capture.QueryFrame()) 
     { 
      if (frame != null) 
      { 
       using (var stream = new MemoryStream()) 
       { 
        // My way to display frame 
        frame.Bitmap.Save(stream, ImageFormat.Bmp); 

        BitmapImage bitmap = new BitmapImage(); 
        bitmap.BeginInit(); 
        bitmap.StreamSource = new MemoryStream(stream.ToArray()); 
        bitmap.EndInit(); 

        webcam.Source = bitmap; 
       }; 
      } 
     } 
    } 
+2

たぶん、より良い解決策は、両方のアプローチを組み合わせることである:ディスパッチャ非アクティブのために聞くが、フレームをレンダリングしていないすべてのUIのタスクはディスパッチャを介して行くよう

private SynchronizationContext _context = SynchronizationContext.Current; void Timer_Elapsed(object sender, ElapsedEventArgs e) { using (Image<Bgr, byte> frame = capture.QueryFrame()) { if (frame != null) { this._context.Send(o => { using (var stream = new MemoryStream()) { // My way to display frame frame.Bitmap.Save(stream, ImageFormat.Bmp); BitmapImage bitmap = new BitmapImage(); bitmap.BeginInit(); bitmap.StreamSource = new MemoryStream(stream.ToArray()); bitmap.EndInit(); webcam.Source = bitmap; } }, null); } } } 

あるいは、あなたはDispatcherInactiveイベントに反応できますある期間が経過するまで。 –

+0

Timer_Elapsed関数はどのように呼び出されますか? – Jonathan

+0

Elapsedイベントを持つTimerクラスを使用してタイマーを設定しました。 https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx –

関連する問題