这是我的一段源码:
//del1Dlg.h
#define WM_UPDATE WM_USER+100
...
public:
      static void myThread(LPVOID Param);
      ...
protected:
      afx_msg LRESULT OnUpdateDataMessage(WPARAM wParam, LPARAM lParam);
      ...// del1Dlg.cpp
...
BEGIN_MESSAGE_MAP(CDel1Dlg, CDialog)
ON_MESSAGE(WM_UPDATE,OnUpdateDataMessage)
...
END_MESSAGE_MAP()....
void CDel1Dlg::OnOK() 
{

DWORD myThreadId;
HANDLE hd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)myThread,this, 0, &myThreadId); 
}
...
void CDel1Dlg::myThread(LPVOID Param)
{
    static CDel1Dlg * pDlg =new CDel1Dlg;  
    ::SendMessage(pDlg->GetSafeHwnd(),WM_UPDATE,0,0);
}
LRESULT CDel1Dlg::OnUpdateDataMessage(WPARAM wParam, LPARAM lParam)
{
    AfxMessageBox("Update");
    UpdateData(FALSE);
    UpdateData(TRUE);
    return 0;
}
目的在于:
  在线程myThread中避免使用pDlg->UpdateData(TRUE)等,而改用SendMessage,
WM_UPDATE为自定义的消息。
为何::SendMessage(pDlg->GetSafeHwnd(),WM_UPDATE,0,0);执行后无任何反应?                      谢谢!

解决方案 »

  1.   

    在myThread中,可以利用参数传入需要的pDlg
    pdlg->SendMessage(WM_UPDATE,0,0);
    如果自定义消息没问题,应该可以
      

  2.   

    改为pDlg->SendMessage(WM_UPDATE,0,0);或者是pDlg->PostMessage(WM_UPDATE,0,0);
      

  3.   

    to 0313700000:
      你好!
      自定义消息应该没问题,因为我在OnOk()中加入
      ::SendMessage(GetSafeHwnd(),WM_UPDATE,0,0);正常。
      您所说的pdlg->SendMessage(WM_UPDATE,0,0);我在myThread中先前试过,
    其结果  似乎  与  在myThread中直接pDlg->UpdateData(TRUE)相同:都会在debug出现错误提示,据说原因是“线程间一般不可共享MFC窗体”。我用消息,原因也正式为此。
                                               谢谢!
      

  4.   

    _china (xs) :
        你说得对, 窗体是属于线程的,不能跨线程, 线程间可以通过消息传递
    窗体消息, 不过不能传窗体类(我试过了, 传过去以后,m_hwnd好像变成0了)
    但如果你直接传递窗口句柄可以成功:
    HANDLE hd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)myThread,
    this->GetSafeHwnd(), 0, &myThreadId); 或
    HANDLE hd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)myThread,
    this->m_hWnd, 0, &myThreadId); 
      

  5.   

    你可以这样处理
    m_ThreadID = ::AfxBeginThread(::myThread,this,THREAD_PRIORITY_LOWEST);//this传入窗体指针
    然后
    void CDel1Dlg::myThread(LPVOID Param)
    {
        CDel1Dlg * pDlg =(CDel1Dlg *)Param;  
        pDlg->SendMessage(WM_UPDATE,0,0)
    }
    这样可以实现线程间共享窗体,我就是这样做的
      

  6.   

    我觉在子线程中用SendMessage有时会出错,
    最好使用PostMessage。你可以试试看