2016-08-24 66 views
0

圖像運行裏面的一些數據處理的Thread一個適當的方式我有一個類:讀取來自其他線程

void thread_function() 
{ 
    while (client != null) 
    { 
    ....some stuff... 
    wrBitmap.WritePixels(rect, rgbch, rowLen, 0); // wrBitmap is WriteableBitmap 
    OnFrameRdy(this, MyEventsArgs); 
    } 
} 

我怎樣才能從沒有記憶複製此Thread進程讀取wrBitmap?我需要將wrBitmap綁定到我的Image wpf控件。那可能嗎?

或者做到這一點的唯一方法 - 是將wrBitmap複製到類中的其他變量並在我的控件中讀取它? 我不想複製變量,導致它給我一個巨大的內存開銷。

我想我可以使用事件並創建我的OnFrameRdy事件,但仍然不讓我使用數據。 這將是非常酷的,如果我可以只輸入Image.source = MyClass.wrBitmap

+0

你是什麼意思「不讓我使用數據」?你在這裏遇到什麼問題?爲什麼你不能在線程中執行'Image.source = MyClass.wrBitmap'? – slawekwin

+0

您是否打算在將它分配給圖像控件後修改WritePixels。 – Clemens

+0

當我試圖編寫'Image.source = MyClass.wrBitmap'時,出現'InvalidOperationException'異常。這是因爲wrBitmap是在其他'Thread'中創建的。我不知道如何將wrBitmap數據傳輸到我的Image控件,而無需內存開銷。 – Aleksey

回答

0

猜測你是從嘗試從不同的線程設置Source屬性越來越InvalidOperationException或在不同的線程比創建使用Bitmap(你嚴重應更明確地說明你想要解決什麼問題)。

如果我是對的,你應該Freeze你的位圖(這不允許改變它)並在UI線程上調用Image.Source。這應該適合你:

void thread_function() 
{ 
    while (client != null) 
    { 
     ....some stuff... 
     wrBitmap.WritePixels(rect, rgbch, rowLen, 0); // wrBitmap is WriteableBitmap 
     wrBitmap.Freeze(); 
     Dispatcher.BeginInvoke((Action)(() => Image.Source = wrBitmap)); 
    } 
} 
+0

是的,你說得對,'InvalidOperationException'是我的問題,因爲我試圖連接來自不同線程的'Source'屬性和'Bitmap'。 'Freeze'和'Dispatcher'工作正常,但我想在循環中使用'wrBitmap','Freeze'不要讓我這樣做。有沒有什麼方法可以在循環中使用相同的'wrBitmap',並且只有在完成時纔將它提供爲'source'? – Aleksey

+0

恐怕我不明白你的意思是「在週期中使用wrBitmap'」。請詳細說明,最好是作爲對問題的編輯。如果你想增量構建圖像,並在每次迭代後顯示結果,我不相信沒有複製中間圖像就可以完成。 – slawekwin