[英]How do I display changing images in a multithreaded WPF application?
我正在開發一個項目,我們需要捕獲和處理圖像以控制機器人。 這兩件事情都很好。
我似乎無法弄清楚的是如何使用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'本身。
它工作 - > 很好 < - 當我使用WPF按鈕來調用代碼時,但是當我使用Threadpool中的WorkerThread來替換兩個'image.source'時,即使標簽是,也不會顯示圖像。
此外,如果我已按下按鈕並顯示圖片,則來自 - > WorkerThread < - 的調用最終會在MainThread中刪除圖像並留下空白區域,而不是將其更新為新內容。
使用Dispatcher我已經刪除了所有的crossthead問題,標簽已更新,但“PresentationFramework - > System.Windows.Controls.Image”是清除的並且沒有更新:-(
在查看stackoverflow時,我發現了這個問題:
它似乎關注與我類似的問題。 然而,答案和OP都沒有評論他如何解決他的問題對我有所幫助。
我很感激你能給我的任何幫助。
BitmapImageSource是一個可凍結的對象,如果您打算跨線程訪問它,應該將其凍結
來自MSDN
Freezable提供Changed事件以通知觀察者對對象的任何修改。 凍結Freezable可以提高其性能,因為它不再需要在更改通知上花費資源。 凍結的Freezable也可以在線程之間共享,而未凍結的Freezable則不能。
...
freezable的Freeze方法使您可以禁用此自我更新功能。 您可以使用此方法使畫筆變為“凍結”或不可修改。
當您在另一個線程上處理圖像時,您需要更改代碼以調用Freeze()
然后才能在UI線程上使用它。 下面有一些工作代碼
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;
}
}
幾篇相關文章:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.