主线程中新建两个用户子线程,但在主线程中给子线程发送消息,只有一个子线程窗口能接收到消息,而另一个子线程窗口接收不到消息。并且总是那个先创建的子线程能接收到消息。主线程中的InitInstance()函数如下:
BOOL CThreadMain::InitInstance()
{
m_pDlgMain = new CDlgMain;  //m_pDlgMain是主线程的窗口指针
m_pDlgMain->Create(CDlgMain::IDD);
m_pDlgMain->ShowWindow(SW_SHOW);  m_pThreadShow = (CThreadShow *)AfxBeginThread( RUNTIME_CLASS(CThreadShow) );      //显示子线程
m_pThreadApply  = (CThreadApply *)AfxBeginThread( RUNTIME_CLASS(CThreadApply) );     //请求子线程
m_hThreadApply = m_pThreadApply->m_pMainWnd->m_hWnd;  //显示窗口句柄
m_hThreadShow = m_pThreadShow->m_pMainWnd->m_hWnd;   //请求窗口句柄
msghwnd *pmsg1=(msghwnd *)malloc(sizeof(msghwnd));
pmsg1->nTime=0;
pmsg1->m_hWnd=m_pDlgMain->m_hWnd; ::PostMessage(m_hThreadApply,WM_SENDHWNDMAIN,0,(LPARAM)pmsg1);//接收不到消息
::PostMessage(m_hThreadShow,WM_OPERATESUC,0,0);     //能接收到消息

return TRUE;
}
如果上面的:
m_pThreadShow = (CThreadShow *)AfxBeginThread( RUNTIME_CLASS(CThreadShow) );      //显示子线程
m_pThreadApply  = (CThreadApply *)AfxBeginThread( RUNTIME_CLASS(CThreadApply) );     //请求子线程改为:
m_pThreadApply  = (CThreadApply *)AfxBeginThread( RUNTIME_CLASS(CThreadApply) );     //请求子线程
m_pThreadShow = (CThreadShow *)AfxBeginThread( RUNTIME_CLASS(CThreadShow) );      //显示子线程
则请求子线程能接收到消息,而显示子线程接收不到消息; 谢谢了!!!!!!!!!

解决方案 »

  1.   

    gz,我只用过PostThreadMessage,用PostMessage还有这种问题啊
      

  2.   

    多半是第二个子线程还没跑起来
    你在PostMessage前断一下,看第二个窗口句柄存不存在
      

  3.   

    我用debug调试了一下,在::PostMessage(m_hThreadApply,WM_SENDHWNDMAIN,0,(LPARAM)pmsg1);和::PostMessage(m_hThreadShow,WM_OPERATESUC,0,0); 前设置断点,然后单步执行,
    显示的m_hThreadApply和m_hThreadShow都有值,
    并且展开m_hThreadApply和m_hThreadShow都有一个提示:“CXX0030:Error:expression cannot be evaluated”.
    在这里我在补充一下:m_hThreadApply和m_hThreadShow两个窗口句柄都是在对应线程类的InitInstance()函数中赋的值,如下:
    BOOL CThreadApply::InitInstance()
    {
             CDlgApply dlgApply;
    m_pMainWnd = &dlgApply;
    dlgApply.DoModal(); return TRUE;
    }BOOL CThreadShow::InitInstance()
    {
    CDlgShow dlgShow;
    m_pMainWnd = &dlgShow;
    dlgShow.DoModal();

    return TRUE;
    }并且m_hThreadShow和m_hThreadApply对应的窗口类中响应上面在主线程所发送的消息函数如下:void CDlgShow::OnOperateSuc(WPARAM wparam,LPARAM lparam)
    {
    MessageBox("显示线程接受到消息!");
    }void CDlgApply::OnGetThreadHwnd(WPARAM wparam,LPARAM lparam)
    {
    MessageBox("请求线程接受到消息");
    msghwnd *pmsg = (msghwnd *)lparam;
    m_hThreadMain = pmsg->m_hWnd;
    delete pmsg;
    }
      

  4.   

    这就奇怪了,你说m_hThreadApply和m_hThreadShow都有值,但是展开又无法显示...?这样吧, PostMessage前加两句
    ASSERT(::IsWindow(m_hThreadShow));
    ASSERT(::IsWindow(m_m_hThreadApply));
      

  5.   

    搞不懂了...只能再给你几种尝试的方法:1. 检查PostMessage的返回值
    2. 把PostMessage改成SendMessage
    3. 重载子线程的PretranslateMessage, 在里面检查有没有收到你的消息
    4. 设置两个通知,等两个子线程中的对话框都初始化完了以后再Post消息
      

  6.   

    问题解决了,应该是第二个线程还没有初始化完成,所以没有接收到消息。
    我是在
    m_pThreadShow = (CThreadShow *)AfxBeginThread( RUNTIME_CLASS(CThreadShow) );      //显示子线程
    m_pThreadApply  = (CThreadApply *)AfxBeginThread( RUNTIME_CLASS(CThreadApply) );     //请求子线程
    后面加上Sleep(1000);
    然后两个线程窗口都可以接收到消息了。