MFC中跨线程UpdateData(FALSE)报错 ASSERT FAILD问题

转载 2014年01月03日 11:21:58

文章来自:http://hi.baidu.com/yu_xiyan/item/27f82bf1a1cc0813d7ff8c8c

MFC程序,在给控件关联的变量赋值后,需要调用UpdateData(FALSE)后才能更新到界面,但是有时候却报错:

断言宏失败,在wincore.cpp的如下位置:
  CObject* p=NULL;
  if(pMap)
  {
   ASSERT( (p = pMap->LookupPermanent(m_hWnd)) != NULL ||
     (p = pMap->LookupTemporary(m_hWnd)) != NULL);

  }
  ASSERT((CWnd*)p == this);   // must be us

这个问题其实是由于跨线程访问UI元素导致的,微软在MSDN中做了如下描述:

In a multi-threaded application written using MFC, you should not pass MFC objects across thread boundaries. As a general rule, a thread should access only those MFC objects that it creates. Failure to do so may cause run-time problems including assertions or unexpected program behavior.

 

也就是说,MFC的UI线程是线程相关的,每个窗口的HandleMap是储存在创建UI那个线程的堆栈里面的(thread-local-storage (TLS) ),所以,你要是在另一个线程里面通过某种方式调用UI的UpdateData(FALSE)函数,他将无法正确执行。

知道了原因就好办事了,下面提供两种解决方法:

1、通过GetDlgItem(IDC_XXX)取得控件后SetWindowText()

    这种方式之所以能得逞,是因为调用SetWindowText 会导致 WM_SETTEXT被发送给目标窗体,由消息机制负责处理:
    ctrlDlg->GetDlgItem(IDC_EDIT19)->SetWindowText(A2W(pData));

2、自定义一个消息,将Update消息发送到UI线程,在UI线程的对话框中处理消息,自己执行UpdateData(FALSE)函数的调用。

申明:如果未加转载说明,本文即为原创文章

转载请注明:转自Roboby's Home

本文链接:MFC中跨线程UpdateData(FALSE)报错 ASSERT FAILD问题

————————————————————-

以下来自csdn
===================arthur======
在MFC中,user句柄和gdi句柄等是对应着一组对象(并不是所有句柄),它们是通过映射关系保存在一个叫做“模块线程状态”里面的,这个“模块线程状态”是属本地线程所拥有的,所以如果在其它的线程中查找句柄对应的对象指针是找不到指定的永久对象指针的,而维护这些句柄与对象指针的映射关系的,就是靠CHandleMap类型,其中楼主所说的
afxMapHWND()
是去取当前线程状态中的当前模块状态里面的当前模块线程状态中所保存的窗口句柄与其对象映射的
CHandleMap类型的指针,在这个线程中没有一次去创建这个映射的指针时,用户如果调用了afxMapHWND()那么它就返回NULL,这时ASSERT(pMap!=NULL)就会现现断言失败,在DEBUG下面当然会跳出错误了。

线程中使用UpdateData出错解决方法

原文链接:http://www.cnblogs.com/lebronjames/archive/2011/02/16/1956029.html 最近写一个程序,需要在自己创建...

工作线程中使用UpdateData出错解决方法

在工作线程中不能使用UpdateData来更新主线程中的数据。界面的东西,最好就是用主线程(界面线程)去执行相应的操作。要想在子线程(工作线程)里执行界面线程的操作,最好是向主线程发送消息。因为MFC...

另开了一个线程,线程里面一个函数调用UpdateData(false),结果就出错,为什么?

MFC是在类层次上的线程安全而不是在对象层次上的线程安全. 如果把一个CWnd   *P传递到另外一个线程,在这个线程中CWnd的有些成员 函数将不能使用,因为在MFC内部维护一个HWND和MFC对象...
  • bilter
  • bilter
  • 2010年08月05日 18:02
  • 4927

线程中使用UpdateData出错解决方法(转)

http://hi.baidu.com/leonardhuang/blog/item/d5fa133f814777cc9e3d62ee.html   最近写一个程序,需要在自己创建的工作线程中更新窗...

UpdateData在线程中出错的解决办法 .

UpdateData在线程中出错的解决办法 2009年12月3日 虚幻 发表评论 阅读评论 最近在写一个监视程序,需要定时查看共享内存中的各个值。于是在MFC中,首先开了一个线程,用的...

解决 Updatedata不能更新、报错问题。(主要是不同的类、线程中出现的)

目的:通过在A对话框(对应A类)中点击按钮控制B对话框(对应B类)的更新(利用Updatedata函数)。 情况1:在A类中使用的Updatedata()只能更新此类(该类指的是此Updatedata...
  • wf6892
  • wf6892
  • 2016年09月09日 15:29
  • 522

由UpdateData(FALSE)想到的窗口刷新问题

由UpdateData(FALSE)想到的窗口刷新问题 本文标签: UpdateData Invalidate     一,前言     有网友提醒我:“在MSDN里面能找到的东西,再...

MFC多线程调用UpdateData函数问题

多线程调用UpdateData   2009-12-01 08:53:42|  分类: VS|Window|举报|字号 订阅 ((CSetupDlg*)AfxG...
  • MFC_tgz
  • MFC_tgz
  • 2014年08月16日 10:00
  • 888

MFC UpdateData(FALSE)和UpdateData(TRUE)的作用

在VC里,可以为对话框上的控件设置对应的变量,如文本框可以设置对应的 CString变量,但是在程序中修改文本框的内容时,对应的CString变量不会随着改变,需要调用UpdateData(TRUE)...

线程进程函数调用对话框Updatedata错误

MFC对象不支持多线程操作。MSDN这样解释的:                                                                            ...
  • whucv
  • whucv
  • 2011年08月12日 22:25
  • 3115
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC中跨线程UpdateData(FALSE)报错 ASSERT FAILD问题
举报原因:
原因补充:

(最多只允许输入30个字)