最近在调试某MFC程序,遇到了问题如下
1,首先是遇到了ReleaseDC(pDC)但是pDC=0x00导致错误,错误信息如下
0x65E9CD61 (mfc90d.dll) (XXXXXXX.exe中)处有未经处理的异常:0xC00000005:读取位置0x00000004时发生访问冲突
经过定位发现错误发生在mfc90d.dll!CWnd::ReleaseDC(CDC *pDC)处
后来经研究发现,这里ReleaseDC(pDC)是在另外一个线程中调用的,而MFC不推荐在线程中访问资源
解决方法:
把直接绘图函数改为发送消息,实例代码如下
CRect rect;
GetDlgItem(IDC_XXXXX)->GetClientRect(&rect);
InvalidateRect(&rect, false);
UpdateWindow();
2,第二个问题,程序是一个视频监控程序,但是图像刷新一段时间之后发现图像停滞
经过dump图像后发现图像是更新的,但是pDC不绘图,后来经过测试发现
在正常刷新的时候,每次获得的pDC都是不同的,而图像停滞后,pDC不再变化
百度得知,这是GDI资源没有释放造成的。
为验证之,在图像停滞后,用任务管理器查看
发现GDI对象确实偶9999个,于是此时系统不再响应
CDC* pDC = GetDlgItem( ID ) ->GetDC();
了。
寻找问题所在,发现有一处,为了修改控件颜色,重载了OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
但是在里面有语句
HBRUSH B = CreateSolidBrush(safecolor);
这句话创建了对象,但是没有释放(也没法释放),删掉后问题解决
总结:
1,不要在线程中使用资源
2,申请GDI对象之后一定要释放