mfc程序长时间运行后报错:a required resource was unavailable
2016-11-17 16:06
417 查看
原因是设置背景色时用到了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());
}
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());
}
相关文章推荐
- mfc程序长时间运行后报错:a required resource was unavailable
- MFC GDI资源泄漏ERROR:a required resource was unavailable
- A required resource was unavailable
- GDI对象增加错误:A required resource was unavailable
- IDE-----VS2005运行过程中"没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"? 的解决
- MFC的程序必须安装.Net Framework才能运行么?
- MFC Windows应用程序的基本运行机制与HelloWin程序详细解
- MFC 之 对话框程序后台运行
- IIS运行asp程序出现The requested resource is in use 和 安装.net 2.0 后运行2.0程序出现 Failed to access IIS metabase 错误的解决
- 《笔记》孙鑫老师MFC第一讲(windows程序内部运行原理)
- [VC/MFC]一条语句实现程序运行时隐藏窗口
- mfc,示例 ctrlbars 程序运行流程分析
- MFC程序运行机制
- Windows和MFC程序运行原理及编写方法
- MFC程序的构造过程和运行机理
- mfc程序的诞生运行和死亡
- [VC/MFC]一条语句实现程序运行时隐藏窗口
- MFC程序的诞生,运行与死亡
- MFC程序只能运行一个实例
- MFC程序带参数运行实例