uilib库gdi句柄泄漏bug修复,duilib防止gdi泄漏的小提醒

转载请说明原出处,谢谢~~

       今天下午群友的网友让我帮忙看一下的duilib程序的问题,程序中包含了List控件,会定时清除所有子项目然后重新添加。但是程序运行一段时间后会自己崩溃!我编译了源码运行后在任务管理器里发现,程序的gdi句柄数一直增加而不减少,不到半分钟的时候gdi句柄数居然增加到10000个!!当时我就惊呆了,然后程序直接崩溃,如图:

       很明显发生了gdi泄漏。随后我也看了自己的仿酷狗程序,居然也发现了gdi泄漏。当音乐项目增加到几百个之后gdi句柄暴涨,程序崩溃。随后进入debug模式开始调试。

     经过3个小时的奋战,终于发现uilib库中有一处地方造成gdi泄漏!过程我就不再赘述了。直接说明问题。

     bug是uilib库的CControlUI控件的构造函数的函数体创建了一个gdi对象:

CControlUI::CControlUI() : m_pManager(NULL),
//省略无用代码
{
//省略无用代码

	::ZeroMemory(&m_rcPadding, sizeof(m_rcPadding));
	::ZeroMemory(&m_rcItem, sizeof(RECT));
	::ZeroMemory(&m_rcPaint, sizeof(RECT));
	::ZeroMemory(&m_rcBorderSize, sizeof(RECT));
	::ZeroMemory(&m_tRelativePos, sizeof(TRelativePosUI));

	m_hRgn = CreateRectRgn(0,0,0,0); //定义新的空的HRGN.不能初始化为NULL

}

     可以看到最后一句m_hRgn = CreateRectRgn(0,0,0,0);创建了gdi对象,m_hRgn变量的说明为:

HRGN m_hRgn;			//当启用不规则区域时,此变量保存该对象的区域

     这个gdi对象在CControlUI控件的构造函数中被创建,析构函数释放。而大家知道,CControlUI控件是所有duilib控件的基类,这就意味了每创建一个控件就会增加一个gdi对象。而恰恰是List控件,有可能会一次性添加上千条子项目,而这些子项目在程序结束时才会被销毁,这样就导致程序增加上千个gdi对象,而一般程序的gdi对象都保持在50个左右,300个gdi对象已经算很多了!

     我看了看和m_hRgn变量相关的代码,发现在uilib库中这个变量目前还没有什么实际用途,所以我把与他相关的代码都删除了,使用uilib库的朋友可以自己删除,也可能下载我修改好的。下载地址:点击打开链接

     以上是说明了uilib库的bug,还没有解决群友的基于duilib库的gdi泄漏的问题。调试他的代码后发现duilib库中并没有gdi泄漏,最终发现是这样的问题出在用于创建自定义控件的xml文件中:

      1)c++调用代码动态增加子项目到List中

      2)每个子项目都是自定义控件,通过xml文件创建。

     问题出在xml文件中,用xml文件动态创建控件是用duilib时的常用功能,而我们千万不要在创建自定义控件的xml文件中使用<Font>标签,否则每次创建一个自定义控件,就会增加相应数量的font对象,而font对象是直接在CPaintManager类中增加的,同样也是在程序结束时才会被释放。偶尔一两个这样的控件无所谓,但是如果用在List中被创建了成千上百个,gdi泄漏就太明显!所以<Font>标签最好统一声明到主xml文件或者专门声明资源的xml文件中!切记

      2014.8.12 Redrain

时间: 2025-01-25 21:01:43

uilib库gdi句柄泄漏bug修复,duilib防止gdi泄漏的小提醒的相关文章

Redrain个人维护并使用的DuiLib和UiLib库源码下载地址

转载请说明原出处:http://blog.csdn.net/zhuhongshu/article/details/40740353,谢谢~~     首先说明一下Duilib和Uilib的区别:UiLIb是DuiLib是升级扩展版,UiLib增加了一些控件,比如渐变的FadeButton,并且增强了不少控件的功能和属性,比如托盘功能,同时也支持一些动画动能,和一些新模块.DuiLib和UiLib当前都处于无人维护的状态.所以我单独做了自己维护的版本.我把我修复的bug.对库的改进和增强.都同步对

修复duilib CEditUI控件和CWebBrowserUI控件中按Tab键无法切换焦点的bug

转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41556615         在duilib中,按tab键会让焦点在Button一类的控件中切换,但是切换焦点一直存在bug,具体的描述如下:         1.在主窗体里弹出新的窗体,当新窗体中存在CEditUI控件并且焦点在此CEditUI控件上,那么按tab键将无法切换焦点而一直处于CEditUI中.(只在新窗体中有此bug,主创体中没有,原因会在后面分析)  

duilib CDateTimeUI 在Xp下的bug修复

转自:http://my.oschina.net/u/343244/blog/370131 CDateTimeUI 的bug修复.修改CDateTimeWnd的HandleMessage方法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 if(WM_NOTIFY==uMsg) {  

仿酷狗音乐播放器开发日志十九——CTreeNodeUI的bug修复二(附源码)

转载请说明原出处,谢谢        今天本来打算把仿酷狗播放列表的子控件拖动插入功能做一下,但是仔细使用播放列表控件时发现了几个逻辑错误,由于我的播放 列表控件是基于CTreeViewUI和CTreeNodeUI做得,所以产生这几个bug的原因还在于他们两个,在<仿酷狗音乐播放器开发日志十一 --CTreeNodeUI的bug修复>中已经修复过一个动态添加控件的相关bug,这属于第二次修复了.关于第一次bug的修复,后来 Duilib扩展群的 joe 又进行过比我更全面的修复,我现在使用的C

win10最新版Build 10041发布!包括大量新功能和Bug修复

  微软官方宣布,Windows 10最新测试编译版本Build 10041已经向Fast Ring快速内测用户发放了,包括大量新功能和Bug修复. 该版本仅面向那些已经安装了上一个内测版本的用户,而且只能通过Windows Update在线更新. Slow Ring慢速内测用户需要等待独立的ISO镜像,具体时间待定. 如何获取?首先加入Windows Insider内测项目,然后进入系统设置- 更新与恢复- 高级设置,将预览版安装方式改为"快速"即可. Build 10041属于技术

Swoole 1.8.12 发布,Bug修复版本

PHP的异步.并行.高性能网络通信引擎Swoole 已发布 1.8.12 版本.此版本是一个BUG修复版本,修复了多个细节问题.建议所有用户升级至此版本. 主要更新: 修复Swoole\Table在遍历数据时删除元素导致迭代器错误的问题 增加Swoole\Http\Client新选项websocket_mask控制WebSocket客户端启用mask 修复Swoole\Server在BASE模式下无法使用task_ipc_mode=3配置 优化Swoole\Http\Server响应体gzip压

KDE Frameworks 5.35.0 发布,核心组件 bug 修复

KDE Frameworks 5.35.0 发布了,本次更新为开发人员带来了一系列在 KDE Plasma 5 桌面环境中使用的许多核心组件中的 bug 修复和新功能实现.例如,改进了 Attica 的错误通知,并在 Plasma Framework 中添加了 VLC Media Player 托盘图标支持.KDE Frameworks 5.35.0 中其它值得关注的组件包括:BluezQt,KActivitiesStats,KPeople,KDE Doxygen Tools,KNotifica

Win10 Mobile Build 10586.107正式推送 BUG修复

继欧洲.印尼等地之后,微软今天正式为Lumia 550/950/950 XL推送了Windows 10 Mobile更新,国行用户也已陆续收到. 升级后的系统版本显示为10.0.10586.107,但没有了技术预览版的字样,从这个角度讲应该就是正式版,只是微软并未公开这样的说法. 虽然贵为正式版,但Build 10586.107未带来任何新特性,主要为bug修复,其改进如下: 修复了开始屏幕磁贴丢失问题. 改善旁白功能的多语言支持. 改善企业政策或者用户启用BitLocker/设备加密时的设备重

《大冲锋》隐身BUG修复公告

尊敬的<大冲锋>http://www.aliyun.com/zixun/aggregation/3290.html">玩家: 由于有部分玩家在情人节版本更新过程中出现文件丢失情况,导致这部分玩家的角色装备出现问题,发生角色隐身现象.目前已将此类BUG修复,并对出现隐身BUG的角色进行装备恢复.为此给您带来的不便,我们深表歉意.感谢您对<大冲锋>的鼓励与支持! <大冲锋>运营团队 2012年2月15日 <大冲锋>(FinalCombat,简称F