簡體   English   中英

如何在多線程WPF應用程序中顯示更改的圖像?

[英]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時,我發現了這個問題:

WPF成像問題

它似乎關注與我類似的問題。 然而,答案和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;
    }
}

幾篇相關文章:

如何將BitmapImage從后台線程傳遞到WPF中的UI線程?

在什么情況下,凍結WPF對象會大大提高性能?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM