MFC+多线程+GDI编程遇到的问题

来源:互联网 发布:高频噪音检测软件 编辑:程序博客网 时间:2024/05/21 18:39

最近在调试某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对象之后一定要释放

0 0
原创粉丝点击