我是靠谱客的博主 风趣摩托,最近开发中收集的这篇文章主要介绍通过及时释放GDI资源避免MFC界面假死,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

某次编写了一个MFC程序,该程序每运行一段时间后,都会出现操作界面无反应的现象,更有甚者,拖动界面后还会导致界面崩溃。然而,调试代码时我发现:后台仍然在正常工作着。

没错!我遇到的就是MFC界面假死问题!


那么究竟是什么原因导致了界面假死呢?

在我的情景下,程序每次进入OnCtlColor()函数后,我都会使用CreateSolidBrush(RGB(0,0,0))来创建一个黑色画刷,将edit ctrl的背景刷成黑色。然而使用完这个画刷后我并没有使用DeleteObject()及时释放,导致画刷数目随着程序运行不断增加。

当GDI资源(画刷是GDI资源中的一种,其余的还有画笔、位图、字体等)超过10000,界面便会陷入假死!


此处插播一下:小伙伴们会好奇,你是怎么监视某个进程占用的GDI资源数目的呢?

推荐工具:GDIView

有需要的请点击链接下载:https://download.csdn.net/download/qq_36570733/16775161

使用起来很简单,这里就不再赘述了。


最后,谈谈如何释放GDI资源。

1、 检查GetWindowDC(), 后面是否有ReleaseDC();

2、 检查GetDC()后面是否有ReleaseDC();

3、 检查画刷CBrush:

CreateSolidBrush()后是否有 DeleteObject();

4、 检查画笔CPen:

CreatePen()后是否有DeleteObject();

5、 检查字体CFont:

CreateFont后是否有DeleteObject();

CreatePointFont()后是否有DeleteObject();

CFont *pOldFont =pDC->SelectObject(&m_font)后是否有pDC->SelectObject(pOldFont);

6、检查位图CBitmap:

CBitmap bmp;
bmp.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height())后是否有bmp.DeleteObject();

7、检查绘图区域CRgn

CreateRoundRectRgn()后是否有DeleteObject();

总结一下就是:Create出来的GDI对象,都要用DeleteObject来释放;Create出来的DC,都要用DeleteDC来释放,GetDC得出的DC,要用ReleaseDC来释放。

 

最后

以上就是风趣摩托为你收集整理的通过及时释放GDI资源避免MFC界面假死的全部内容,希望文章能够帮你解决通过及时释放GDI资源避免MFC界面假死所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部