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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值