2016-04-05 6 views
1

私は、ロボットを制御するために画像をキャプチャして処理する必要があるプロジェクトに取り組んでいます。それらの2つのことはうまくいっています。マルチスレッドのWPFアプリケーションで変化するイメージを表示するにはどうすればよいですか?

私が把握できないように見えるのは、WPFを使用してプリプロセスイメージとポストプロセスイメージを表示する方法です。

私はこのコードを使用しているアプリを持っている:

public CamNotification(string label1, string label2, BitmapSource image1, BitmapSource image2) 

private bool hwLink_SetInfos(CamNotification info) 
{ 
    try 
    { 
     Application.Current.Dispatcher.BeginInvoke((Action)(() => 
     { 
      lblText1.Content = info.Label1; 
      lblText2.Content = info.Label2; 

      ImageBox1.Source = info.Image1; 
      ImageBox2.Source = info.Image2; 
      InvalidateVisual(); 
     })); 
     return true; 
    } 
    catch (Exception ex) 
    { 
     Debugger.Break(); 
     return false; 
    } 
} 

それは画像を記述するラベルと「image.sourceの自分の両方を変更します。

作品 - >fine < - コードを呼び出すためにWPFボタンを使用しても、2つの 'image.source'を置き換えるThreadpoolからWorkerThreadを使用してみると、画像は表示されませんラベルはあります。私はすでにボタンを押していると、画像が表示された場合

また、からの呼び出し - >WorkerThread < - MainThreadで終わる画像を削除し、新しいコンテンツにそれらを更新するのではなく、空白領域を残し。ディスパッチャを使用して

は、私はすでにラベルが更新され、すべてのcrossthead-の問題を削除したが、「PresentationFramework - > System.Windows.Controls.Imageは」cleardであると私はstackoverflowのを見ながら

:-(更新されませんこの質問が見つかりました:

WPF imaging problems

を私と同様の問題に関係しているようだが、答えもOPはどちらも、彼は彼の問題を解決したかについてコメントする私を助けてきた

私はあなたが私に与えることができる任意の助けに感謝します。

+0

。ソースを設定する前にinfo.Image1.Freeze()とinfo.Image2.Freeze()を呼び出してみましたか? – Tone

+1

@Toneそれだった。どうもありがとうございました。興味のある人は:{Dispatcherの前にtry {の後にinfo.image1.Freeze()とinfo.image2.Freeze()を置く。今の魅力のように動作します^^ –

+0

よろしくお願いします。私は参考に完全な答えを追加しました。 – Tone

答えて

0

BitmapImageSourceあなたは

AのFreezableオブジェクトに任意の 変更のオブザーバーを通知するためのChangedイベントを提供しMSDNからスレッド

全体にアクセスする場合は凍結されるべきである凍結可能オブジェクトであります。 Freezableをフリーズすると、 の通知にリソースを費やす必要がなくなり、 のパフォーマンスが向上する可能性があります。フリーズされたFreezableは、スレッド間で共有することもできます。 フリーズしたFreezableでは共有できません。

...

凍結可能のフリーズ方法は、この自己更新 機能を無効にすることができます。このメソッドを使用して、ブラシを「フリーズ」にしたり、 を変更したりすることができます。

イメージを別のスレッドで使用している場合は、UIスレッドで使用する前にFreeze()を呼び出すようにコードを変更する必要があります。

public CamNotification(string label1, string label2, BitmapSource image1, BitmapSource image2) 

private bool hwLink_SetInfos(CamNotification info) 
{ 
    try 
    { 
     info.Image1.Freeze(); 
     info.Image2.Freeze(); 

     Application.Current.Dispatcher.BeginInvoke((Action)(() => 
     { 
      lblText1.Content = info.Label1; 
      lblText2.Content = info.Label2; 

      ImageBox1.Source = info.Image1; 
      ImageBox2.Source = info.Image2; 
      InvalidateVisual(); 
     })); 
     return true; 
    } 
    catch (Exception ex) 
    { 
     Debugger.Break(); 
     return false; 
    } 
} 

以下のいくつかの作業コードに関連する記事のカップル:それが凍結されていない画像の問題のように聞こえる

How do you pass a BitmapImage from a background thread to the UI thread in WPF?

In what scenarios does freezing WPF objects benefit performance greatly?

関連する問題