2014-10-01 29 views
0

我的程序將位圖幀作爲視頻繪製到WPF控件。WPF:繪製位圖 - 訪問衝突?

的示例代碼如下:

while(true) 
{ 
    mStream = gcnew UnmanagedMemoryStream((unsigned char*)jpegBuff, jpegBuffLenght); 
    JpegBitmapDecoder^ decoder = gcnew JpegBitmapDecoder(mStream, BitmapCreateOptions::PreservePixelFormat, BitmapCacheOption::Default); 
    bitmapSource = decoder->Frames[0]; 
    myWPFControl.DrawImage(bitmapSource) 
} 

我遇到了兩個問題,我的代碼:

1)有時與消息"Insufficient memory to continue the execution of the program"崩潰時在線路JpegBitmapDecoder^ decoder = gcnew JpegBitmapDecoder(...)

2運行)有時它與消息「訪問衝突」崩潰,並且在這種情況下的調用棧如下:

enter image description here

有人可以告訴我在我的代碼中的問題。

非常感謝!

牛逼&牛逼

+1

圖像有多大?也是這意味着被標記'C++'不''c#' – 2014-10-01 03:49:21

+0

@ sa_ddam213:我正在使用託管代碼。此圖像是1280x720,大小約2,7MB /幀 – TTGroup 2014-10-01 03:53:27

+0

我不知道它是否有幫助,但我認爲您應該在每個循環結束時關閉UnmanagedMemoryStream。 – Fratyx 2014-10-01 05:11:56

回答

1

你實際看到的內存壓力,當你運行你的程序?

我發現在與內存不足相關的情況下,與Bitmap相關的類拋出OutOfMemoryException。它甚至被記錄在案:Image.FromFile如果支持文件格式會拋出OOM。

也許偶爾在流中會有一個損壞的圖像導致它拋出OOM?

如果你看到內存壓力,這種胎面表明管理對象在時間上不GC'd在緊張而循環:

http://social.msdn.microsoft.com/Forums/vstudio/en-US/782d1eaa-a0f3-4b10-8775-01fcaa063997/wpf-draw-image?forum=wpf

然而,每個幀後調用GC.Collect的() ,如鏈接中的解決方案,可能不可接受。

+0

謝謝! 我認爲你提到的情況可能會發生:「也許偶爾在流中有一個腐敗的圖像,導致它拋出OOM?」。那麼如果它是由一個損壞的圖像引起的,怎麼處理呢? – TTGroup 2014-10-01 10:02:55

+0

我不認爲你可以。也許你可以捕捉到特定的異常(不管它是否感到捕捉並抑制OOM異常)並跳過該框架,而是顯示前一個異常。 – FarmerBob 2014-10-02 02:27:43