2012-04-12 10 views
0

私はwpfイメージオブジェクトを持っており、ライブイメージを表示します。だから私は画像を更新するためにタイマーを使いました。WPFイメージングの問題

public void LoadLiveImage() 
     { 

System.Windows.Media.PixelFormat pf = PixelFormats.Bgr24; 
        int stride = 4 * ((24 * cameraFrame.img_width + 31)/32); 
        BitmapSource bmpImage= BitmapSource.Create(cameraFrame.img_width, cameraFrame.img_height, cameraFrame.img_width, cameraFrame.img_height, pf, null, cameraFrame.img_pixel, stride); 
        RemoteCameraImage.Source = bmpImage; 
} 

void dispatcherTimer_Tick(object sender, EventArgs e) 
     { 
      LoadLiveImage();   

     } 

問題はありません。これは問題ありません。 しかし、これをスレッドに移動しようとしましたが、イメージは表示されません。

private void showLiveImage() 
     { 
       while (this.isCameraViewOpen) 
       { 
       if (RemoteCameraImage.Dispatcher.CheckAccess()) 
         { 
          System.Windows.Media.PixelFormat pf = PixelFormats.Bgr24; 
          int stride = 4 * ((24 * cameraFrame.img_width + 31)/32); 
          BitmapSource bmpImage = BitmapSource.Create(cameraFrame.img_width, cameraFrame.img_height, cameraFrame.img_width, cameraFrame.img_height, pf, null, cameraFrame.img_pixel, stride); 
          RemoteCameraImage.Source = bmpImage; 

          System.Threading.Thread.Sleep(5); 
         } 
         else 
          this.RemoteCameraImage.Dispatcher.Invoke(DispatcherPriority.Normal, new ImageUpdater(this.showLiveImage)); 

        } 

} 

showLiveImageはスレッドとして実行しています。画像が受信され、そこに問題はありません。 img_pixel配列をbmpファイルに保存してテストし、ファイルが生成されました。画像は表示されません。そこで、ソースが割り当てられた後にメッセージボックスを表示させてから、Imageオブジェクト上のイメージを見ることができます。だから私は問題を私は睡眠時間を増やしたと思うが、イメージさえもリフレッシュされない。何が問題なのでしょうか?

編集: イメージを更新していたコードを別の関数に移動した後、正常に動作します。私はBeginInvoke()を使用しました。

答えて

0

いつか前、私は似問題を抱えていたと私はあなたが持っている一度あなたが画像を変更するつもりはありません場合は、私

Images on second thread

WPF Dispatcher {"The calling thread cannot access this object because a different thread owns it."}

のためにそれをsovled StackOverflowの上でこれを見つけました を作成した後、Freezable.Freezeを使用してフリーズし、 ディスパッチャーデリゲートのGeneratedImageに割り当てます(BitmapImageは になります)。 y、したがってフリーズの結果としてスレッドセーフです)。他の オプションは、 バックグラウンドスレッドのMemoryStreamにイメージをロードし、そのストリームでディスパッチャデリゲート BitmapImageの のUIスレッドにBitmapImageを作成することです。

+0

ディスパッチャーがオブジェクトにアクセスできないという問題はありません。 MessageBoxのようにスレッドにユーザーアクションを追加すると、イメージが表示されます。私も凍結を試みたが、それは問題を解決しなかった。 – xaria

0

アプリケーション。現在のディスパッチャーを使用してください。 私はこれがトリックをすると信じています。

乾杯

+0

Nah ...は動作しません:( – xaria