//主窗口的一个接口,用来添加记录的
MainDlg::Log(char *log)
{
   m_LogText+=_T(log);
   UpdateData(0);
}
//线程中调用该接口
ThreadFun()
{
   ...
   pdlg->Log("aaa");
   //pdlg是MainDlg的指针,全局变量;
   ...
}每次都是UpdateData这里出异常错误
注释掉就没错,但不能刷新Log了这是什么问题?
怎么解决?
各位高手帮帮忙~  急得要哭了 :~(

解决方案 »

  1.   

    我没有试过这种情形,我觉得,应该将Log(char *log)函数写为一个公共函数,而不是MainDlg的方法,在Log中调用object.UpdateData()
      

  2.   

    在第一次调用前dlg是否已经初始化?
      

  3.   

    你这样做会有问题的。
    建议方法如下:在线程函数中pDlg->PostMessage(WM_LOG,,,);
    然后建一个消息响应函数,让对话框处理该消息 并更新。
      

  4.   

    我觉得是不是你的窗口不支持UpdateData(BOOL) ,
    比如,你没有定义宏DECLARE_DYNCREATE()和IMPLEMENT_DYNCREATE(..)什么的。还有,跟踪一下m_LogText的内容哈。看你都要哭了,帮你UP一下,呵。
      

  5.   

    由于对话框是在主线程中创建的,但是在这个线程中,你只传递了对话框的指针,并没有把相关数据传递到线程中,这样当调用UpdateData的时候,发送的消息将发送到该线程的队列,而不是主线程的消息队列,那么由于对话框的窗口句柄在该线程中根本不存在,这样就会产生无效窗口句柄访问异常了。
      

  6.   

    1)首先在单线程情况下确认你的接口函数没有问题
    2)在线程函数中,调用log()之前,用ASSERT(::IsWindow(pDlg->m_hWnd))确认窗口有效
      

  7.   

    to skybblue(天蓝) :
    ::SendMessage和::PostMessage是可以跨越线程边界的,应该不是“无效窗口句柄访问异常”的问题。
      

  8.   

    将Log函数中的代码替换成如下形式,你看行不行!m_LogText+=_T(log);
    SetDlgItemText(IDC_LOG,m_LogText);
      

  9.   

    to boxban(master-dreamer) :
    你可以跟踪一下,产生的错误就是窗口句柄无效的访问错误,但是不是因为SendMessage和PostMessage产生的。
      

  10.   

    问题解决了
    谢谢skybblue(天蓝)和boxban(master-dreamer)
    :)