这个问题以前碰见过,
http://www.dream2fly.net/blog/?action=show&id=92
问题:
我在一个对话框程序里建了一个工作线程,把该对话框对象的指针传递给该工作线程,
在工作线程函数内部:
(CMyDlg*)pDlg=(CMyDlg*)lParam;
..................................
..............................
//更新对话框上显示的内容
pDlg->UpdateData(FALSE);
回答:
Microsoft 知识库147578说得很清楚:在多线程程序中,MFC对象不能跨越线程边界。也就是说,A线程创建的对象只有在A线程范围内访问才是安全的,问题中作者将A线程创建的对象指针传递到B线程,让B线程来访问该对象,显然违反了这一安全原则,出现异常就不奇怪了。那么,线程间就不能共享对象的内容了吗?也不是绝对的,可以采取一些策略:采用传递对话框handle代替对象指针,然后调用CWnd::FromHandle(handle)构造该对话框的临时对象,对该临时对象进行访问,就不会出问题了。当然这之间也涉及线程间的同步问题,详细说明参看Microsoft知识库147578:
结论:永远不要在多线程中传递MFC对象!!
另外,对UpdateData()函数要特别小心!
在一个循环中调用UpdateData(),会发现直到循环完成窗口才发生更新!!!这也是smartkid端口扫描代码中困惑我两个多月的问题!!切记。