动态占用资源的gdi问题

原创 2012年03月27日 12:58:33

缘起是看到这个帖子,

http://topic.csdn.net/t/20050617/11/4088812.html

http://topic.csdn.net/u/20070211/09/7c314545-3b40-4e05-86ed-7e31812cde20.html

这两个帖子里面的gdi资源问题,长时间运行崩溃或者无颜色,实质是动态生成了过多的资源,而没有释放。


这个问题是设计者没有关注好资源的使用,盲目的动态生成。解决这个问题的关键是注意不要反复生成,相应的应当有几个可预计的资源缓存。

比如在使用

HBRUSH   CSaleMang::OnCtlColor(CDC*   pDC,   CWnd*   pWnd,   UINT   nCtlColor)   

HBRUSH   hbr   =   CDialog::OnCtlColor(pDC,   pWnd,   nCtlColor); 

//   TODO:   Change   any   attributes   of   the   DC   here 
if(nCtlColor==CTLCOLOR_LISTBOX) 

pDC-> SetTextColor(RGB(0,0,0)); 
pDC-> SetBkColor(RGB(233,233,220)); 
HBRUSH   b=CreateSolidBrush(RGB(233,233,220)); 
return   b; 

else   if(nCtlColor==CTLCOLOR_SCROLLBAR) 

pDC-> SetTextColor(RGB(0,0,0)); 
pDC-> SetBkColor(RGB(233,233,220)); 
HBRUSH   b=CreateSolidBrush(RGB(233,233,220)); 
return   b; 

else   if(nCtlColor==CTLCOLOR_EDIT) 

pDC-> SetTextColor(RGB(0,0,0)); 
pDC-> SetBkColor(RGB(233,233,220)); 
HBRUSH   b=CreateSolidBrush(RGB(233,233,220)); 
return   b; 

else   if(nCtlColor==CTLCOLOR_STATIC) 

pDC-> SetTextColor(RGB(0,0,0)); 
pDC-> SetBkColor(RGB(160,180,220)); 
HBRUSH   b=CreateSolidBrush(RGB(160,180,220)); 
return   b; 

else   if(nCtlColor==CTLCOLOR_DLG) 

pDC-> SetTextColor(RGB(0,0,0)); 
pDC-> SetBkColor(RGB(160,180,220)); 
HBRUSH   b=CreateSolidBrush(RGB(160,180,220)); 
return   b; 

//   TODO:   Return   a   different   brush   if   the   default   is   not   desired 
return   hbr; 

这个就是其中一个崩溃的实例,其中的CreateSolidBrush就是没有限制的,随着事件函数的调用反复生成,造成资源占用。

解决这个问题的方式就是在先生成几个HBRUSH变量备用,在有必要的时候,比如可以被客户定制的时候,先要DeleteObject()已经create的,而后再create一个也就是说,create的变量在DeleteObject()前一直存在,是一片内存资源被占用了,如果不是类成员变量或者全局变量的话,即使有DeleteObject()也是指向不明确的

看上去这个事能看明白了。

相关文章推荐

Gdi+ 在Win32动态库,编译出错问题解决

转自http://www.cnblogs.com/2356/archive/2009/10/27/1590574.html   GDI+是从windows XP开始提供的图形库,基于GDI构建 ...

关于应用程序出现窗口不完整,GDI对象猛增,GDI资源泄漏的问题的探讨

http://hi.baidu.com/qi_xian/blog/item/08011716e096751e962b4345.html本文转载于3SDN: http://www.3sdn.net有时候...

用VC资源动态链接库解决国际化问题

随着计算机应用的普及,应用软件跨国使用越来越频繁,如何实现应用软件的国际化,成为许多程序员关心的问题。这种国际化问题相对使用某一种语言的用户来说,就是本地化问题。本地化的含义比仅仅翻译菜单栏和对话框的...

动态规划----资源问题

一、机器分配问题 1.问题引入: 总公司拥有高效生产设备M台,准备分给下属的N个公司。各分公司若获得这些设备,可以为国家提供一定的盈利。问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值。...
  • w_t_y_y
  • w_t_y_y
  • 2017年04月03日 11:57
  • 299

动态规划算法之资源分配问题及其空间优化方案

资源分配问题:某厂根据计划安排,拟将n台相同的设备分配给m个车间,各车间获得这种设备后,可以为国家提供盈利Ci j(i台设备提供给j号车间将得到的利润,1≤i≤n,1≤j≤m)。问如何分配,才使国家...

资源分配问题(动态规划)

//问题描述:资源分配问题   //某厂根据计划安排,拟将n台相同的设备分配给m个车间,各车间获得这种设备后,可以为国家提供盈利Ci j(i台设备提供给j号车间将得到的利润,1≤i≤n,1≤j≤m...

windows资源管理(内核对象/GDI对象/user对象)

在使用c++进行windows编程时,程序员除了管理使用new/malloc动态在堆上分配出来的内存外,还需要对windows的内核对象、GDI对象和user对象进行管理,这些对象使用句柄来标识,通过...
  • fion45
  • fion45
  • 2013年08月14日 17:32
  • 1279
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态占用资源的gdi问题
举报原因:
原因补充:

(最多只允许输入30个字)