0

我的程序正在将位图帧作为视频绘制到 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)
}

我的代码遇到了两个问题:

"Insufficient memory to continue the execution of the program"1)有时它在在线运行时会与消息一起崩溃JpegBitmapDecoder^ decoder = gcnew JpegBitmapDecoder(...)

2)有时它会因“访问冲突”消息而崩溃,这种情况下的调用堆栈如下:

在此处输入图像描述

有人可以告诉我代码中的问题。

非常感谢!

电通

4

1 回答 1

1

当你运行你的程序时,你真的看到内存压力了吗?

我发现在与内存不足无关的情况下,与位图相关的类会抛出 OutOfMemoryException。它甚至被记录在案:如果支持文件格式,Image.FromFile会抛出 OOM。

也许有时流中确实存在损坏的图像,导致它抛出 OOM?

如果您确实看到内存压力,则表明托管对象未在紧的 while 循环中及时进行 GC:

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

但是,像链接中的解决方案一样,在每一帧之后调用 GC.Collect() 可能是不可接受的。

于 2014-10-01T09:05:10.313 回答