Chinaunix首页 | 论坛 | 博客
  • 博客访问: 201508
  • 博文数量: 63
  • 博客积分: 1970
  • 博客等级: 上尉
  • 技术积分: 600
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-22 14:26
文章分类

全部博文(63)

文章存档

2013年(2)

2012年(11)

2011年(19)

2010年(6)

2007年(11)

2006年(14)

分类: C/C++

2007-04-27 23:07:33

这个问题以前碰见过,

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:
::自动识别的URL::

结论:永远不要在多线程中传递MFC对象!!

另外,对UpdateData()函数要特别小心!
在一个循环中调用UpdateData(),会发现直到循环完成窗口才发生更新!!!这也是smartkid端口扫描代码中困惑我两个多月的问题!!切记。

阅读(1310) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~