最近在使用mfc进行多线程程序开发的过程中,由于需要实时在某个控件上进行数据更新操作,因此将某个控件进行了变量绑定,通过改变变量进行数据更新操作,但是每次都显示错误导致程序不能运行,具体指向wincore.cpp文件的972行:
// should also be in the permanent or temporary handle map
CHandleMap* pMap = afxMapHWND();
ASSERT(pMap != NULL);
在网上查了很多资料都没有解决方法,经过多次打尝试之后,发现只要将UpdateData()函数进行注释后,程序就能正常运行了,通过查看相关的资料觉得问题产生的原因如下:
1、 mfc的大多数类不是线程安全的,调用传入对象的成员函数可能不会报错,但是未必能达到程序预定的功能!
2、 mfc与界面有关的类,其大多数成员方法都是通过sendmessage实现的,如果消息处理函数本身不是线程安全的,你从工作线程中调用这些方法迟早会同你界面线程的用户消息响应发生冲突;
3、对于CWnd相关的类,即使传入窗口句柄,有时操作也会引起异常(ASSERT异常):通过句柄获取窗口对象并且调用其成员函数或者成员变量!因为该对象是临时对象,访问其成员变量没有意义,访问其成员函数可能会抛出异常!
所以在需要实时更新控件显示信息的时候,应该自定义消息进行处理,不要使用mfc提供的消息映射机制。
参考自:
http://www.cnblogs.com/yan-boy/archive/2012/09/08/2676154.html