动态占用资源的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()也是指向不明确的

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

【转】Windows下资源泄漏检测

http://hi.baidu.com/doudou745/item/a26e0e26e6c9dfd3a417b604 【转】Windows下资源泄漏检测 前言...
  • love_hot_girl
  • love_hot_girl
  • 2014年04月09日 23:32
  • 650

动态规划 资源分配问题

资源分配问题是考虑如何把有限分配给若干个工程的问题。参考《算法设计与分析》 下面直接贴代码: //为了和书上的内容一致,我的变量名、变量所代表的意思和书上的几本一致 #include #inc...
  • gaopengxiazhibing
  • gaopengxiazhibing
  • 2016年05月09日 14:26
  • 2282

从资源中加载jpg, png到GDI+ Image

从资源中加载jpg和png文件, 貌似不应该是个大问题, 一google结果一大堆, 却有两个陷阱,trap啊 1, 是Bitmap(RT_BITMAP)类型的图片无法加载, RT_BITMAP...
  • wwqingyue
  • wwqingyue
  • 2014年12月09日 12:43
  • 1646

关于GDI资源使用后未释放,导致GDI对象猛增,程序花屏,异常退出的问题

调试一个对话框程序,对话框上加载了自己实现的一个Grid控件。当添加多条数据后拖动滚动条多次后导致控件花屏。开始以为是ScrollWindow函数调用有问题,但打开资源管理器发现进程对应的GDI对象在...
  • passionkk
  • passionkk
  • 2014年12月11日 18:39
  • 1184

WPF的Image控件BitmapImage以及Uri的资源占用问题

今儿没干啥活儿,花了一天时间把这个问题研究了一下。通过BitmapImage的Clone方法,保持使用Uri,同样可以解决问题。     场景: WPF下用Image控件展示图片; ...
  • yulongguiziyao
  • yulongguiziyao
  • 2014年05月03日 21:07
  • 1631

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

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

GDI+多线程C#编程显示动态画面

1、C#的界面编程中,很多情况都会使用到动态的界面,也就是需要不断的在界面上绘制图形,动态显示系统数据的变化。这里将会用到的知识点包括C#的GDI编程,C#的后台监控程序,或者使用多线程也可以实现。 ...
  • wuguanghao
  • wuguanghao
  • 2017年03月15日 23:39
  • 611

java生产环境下找出占用CUP较多资源线程 相对定位先用top命令找出占用资源厉害的java进程id

在这里对linux下、sun(oracle) JDK的线程资源占用问题的查找步骤做一个小结;linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资...
  • dongdong_java
  • dongdong_java
  • 2013年12月04日 15:39
  • 3080

Ubuntu查看系统资源占用(内存,cpu和进程)

1. top 实时地对系统处理器的状态进行监视。 TOP前五行统计信息:
  • we_shell
  • we_shell
  • 2014年07月04日 15:47
  • 6389

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

//问题描述:资源分配问题   //某厂根据计划安排,拟将n台相同的设备分配给m个车间,各车间获得这种设备后,可以为国家提供盈利Ci j(i台设备提供给j号车间将得到的利润,1≤i≤n,1≤j≤m...
  • nGeometry
  • nGeometry
  • 2013年11月29日 14:17
  • 10364
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态占用资源的gdi问题
举报原因:
原因补充:

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