MFC GDI资源泄漏ERROR:a required resource was unavailable
2012-04-25 13:31
525 查看
mfc程序长时间运行后报错:a required resource was unavailable
原因是设置背景色时用到了GDI资源,程序刚开始运行的时候没问题,但随着时间的蔓延,GDI资源耗尽,则报错:a required resource was unavailable。
GDI资源使用数量可在任务管理器中查看。
也就是说GDI资源泄漏的问题。
接着找到用到GDI资源的地方,主要代码如下(在OnPaint()中):
if(nCtlColor == CTLCOLOR_STATIC) //针对所有的标签
{
//pDC->SetBkMode(TRANSPARENT);
pDC->SetBkColor(RGB(78,78,78));
pDC->SetTextColor(RGB(255,255,255));
//return (HBRUSH)::GetStockObject(NULL_BRUSH);
//return (HBRUSH)::GetStockObject(DKGRAY_BRUSH);
HBRUSH myhbr= CreateSolidBrush(RGB(85,85,85));
return myhbr;
}
将任务管理器中GDI对象打开,专门查看程序的GDI资源利用情况,发现只要程序一产生一个重绘事件(比如我拖动,拖动任务管理器窗口,放大缩小程序窗口),GDI资源就会增多。这种现象表示问题十有八九在OnPaint()函数中,但是我将程序用到的所有OnPaint()函数都查看过了,没什么可疑的,再次排查时,突然想到OnCtrlColor函数也会在界面刷新时调用,一查看果然发现问题,OnCtrlColor里返回的画刷的句柄因为是局部变量而没有被释放,改为成员变量,作如下修改后,解决问题
if(nCtlColor == CTLCOLOR_STATIC) //针对所有的标签
{
//pDC->SetBkMode(TRANSPARENT);
pDC->SetBkColor(RGB(78,78,78));
pDC->SetTextColor(RGB(255,255,255));
//return (HBRUSH)::GetStockObject(NULL_BRUSH);
//return (HBRUSH)::GetStockObject(DKGRAY_BRUSH);
//HBRUSH myhbr= CreateSolidBrush(RGB(85,85,85));
//return myhbr;
m_brBrush.DeleteObject();
m_brBrush.CreateSolidBrush(RGB(85,85,85));
return static_cast <HBRUSH> (m_brBrush.GetSafeHandle());
}
即可。
参考:http://blog.csdn.net/xyl_nuaa/article/details/6827365
http://hi.baidu.com/qi_xian/blog/item/08011716e096751e962b4345.html
原因是设置背景色时用到了GDI资源,程序刚开始运行的时候没问题,但随着时间的蔓延,GDI资源耗尽,则报错:a required resource was unavailable。
GDI资源使用数量可在任务管理器中查看。
也就是说GDI资源泄漏的问题。
接着找到用到GDI资源的地方,主要代码如下(在OnPaint()中):
if(nCtlColor == CTLCOLOR_STATIC) //针对所有的标签
{
//pDC->SetBkMode(TRANSPARENT);
pDC->SetBkColor(RGB(78,78,78));
pDC->SetTextColor(RGB(255,255,255));
//return (HBRUSH)::GetStockObject(NULL_BRUSH);
//return (HBRUSH)::GetStockObject(DKGRAY_BRUSH);
HBRUSH myhbr= CreateSolidBrush(RGB(85,85,85));
return myhbr;
}
将任务管理器中GDI对象打开,专门查看程序的GDI资源利用情况,发现只要程序一产生一个重绘事件(比如我拖动,拖动任务管理器窗口,放大缩小程序窗口),GDI资源就会增多。这种现象表示问题十有八九在OnPaint()函数中,但是我将程序用到的所有OnPaint()函数都查看过了,没什么可疑的,再次排查时,突然想到OnCtrlColor函数也会在界面刷新时调用,一查看果然发现问题,OnCtrlColor里返回的画刷的句柄因为是局部变量而没有被释放,改为成员变量,作如下修改后,解决问题
if(nCtlColor == CTLCOLOR_STATIC) //针对所有的标签
{
//pDC->SetBkMode(TRANSPARENT);
pDC->SetBkColor(RGB(78,78,78));
pDC->SetTextColor(RGB(255,255,255));
//return (HBRUSH)::GetStockObject(NULL_BRUSH);
//return (HBRUSH)::GetStockObject(DKGRAY_BRUSH);
//HBRUSH myhbr= CreateSolidBrush(RGB(85,85,85));
//return myhbr;
m_brBrush.DeleteObject();
m_brBrush.CreateSolidBrush(RGB(85,85,85));
return static_cast <HBRUSH> (m_brBrush.GetSafeHandle());
}
即可。
参考:http://blog.csdn.net/xyl_nuaa/article/details/6827365
http://hi.baidu.com/qi_xian/blog/item/08011716e096751e962b4345.html
相关文章推荐
- mfc程序长时间运行后报错:a required resource was unavailable
- mfc程序长时间运行后报错:a required resource was unavailable
- GDI对象增加错误:A required resource was unavailable
- A required resource was unavailable
- MFC GDI资源泄漏MFC GDI资源泄漏
- python error python version 2.7 required,which was not found in the registry
- 搜狗输入法Can not lock /tmp/sogou-qimpanel:0.pid: Resource temporarily unavailable.(资源不可用)问题解决
- su: cannot set user id: Resource temporarily unavailable(资源不可用)
- win32汇编 CreateDC GetDC CreatePen CreateSolidBrush 与GDI资源泄漏
- Error之ViewPage :Required method instantiateItem was not overridde
- pysctp中出现的IOError: [Errno 11] Resource temporarily unavailable以及无限重复接收的问题
- javax.servlet.UnavailableException: Parsing error processing resource path /WEB-INF/struts-config.xm
- The "GenerateResource" task failed unexpectedly. a generic error occured in GDI+
- linux 多线程时出错:Create pthread error! Resource temporarily unavailable
- ulimit命令&pthread_create() error: Resource temporarily unavailable
- GDI对象和CDC的使用方法(防止资源泄漏)
- 定位MFC程序GDI对象泄漏过程中的一些经验
- TNS-12518,TNS-12536,TNS-00506,Linux Error: 11: Resource temporarily unavailable
- 引用系统资源 error: Error: Resource is not public.
- 一个GDI资源泄漏的错误 记录下来 以后用的到