问题:MFC程序运行后弹出“所需资源不可用”
MFC写的软件在运行很长一段时间后,弹出“所需资源不可用”,软件界面不再响应。
原因分析:GDI相关资源耗尽
GDI(graphics device interface,图形设备接口)可以理解为MFC画图显示相关的工具。
通常资源包括DC、BRUSH和BITMAP等资源,大概相应的绘图代码执行10000次以上,有超过10000个资源未释放就会导致此问题出现。
解决方案:检查GDI相关资源确保分配后都得到了释放
GDI | 分配 | 释放 |
---|---|---|
位图(HBITMAP) | CreateBitmap,CreateBitmapIndirect,CreateCompatibleBitmap,CreateDIBitmap,CreateDIBSection,CreateDiscardableBitmap | DeleteObject |
画刷(HBRUSH) | CreateBrushIndirect,CreateDIBPatternBrush,CreateDIBPatternBrushPt,CreateHatchBrush,CreatePatternBrush,CreateSolidBrush | DeleteObject |
设备上下文(HDC) | CreateDC | DeleteDC,ReleaseDC |
字体(HFONT) | CreateFont,CreateFontIndirect | DeleteObject |
内存DC(HDC) | CreateCompatibleDC | DeleteDC |
调色板(HPALETTE) | CreatePalette | DeleteObject |
画笔(HPEN) | CreatePen,CreatePenIndirect | DeleteObject |
区域(HRGN) | CombineRgn,CreateEllipticRgn,CreateEllipticRgnIndirect,CreatePolygonRgn,CreatePolyPolygonRgn,CreateRectRgn,CreateRectRgnIndirect,CreateRoundRectRgn, | DeleteObject |
问题结果
去找了代码中用到GDI资源部分的代码,检查了上面表格中分配和释放代码是否一一配对。
结果发现确实少释放了一些,我用GDI每次显示两张图像,由于两张图像资源变量名都是一致,最后释放的时候只释放了第二张没有释放第一张。随着显示次数越来越多,就出现了“所需资源不可用”。
把GDI资源分配和释放一一配对之后,一直运行很久都没事。