我在主线程里创建了一个子线程,然后子线程在适当的时候,会回调(callback)主线程中的代码去显示一个无模式对话框,当该无模式对话框show出来之后,然后界面就没反应了所以我怀疑系统发给无模式对话框的消息是否被子线程给截获了?如果是,请问有何解决方法呢?

解决方案 »

  1.   

    什么叫做主线程代码?就算回调这个对话框也是属于子线程的,所以没有反应也是正常的Post主线程一个消息,然后在主线程相应这个消息然后创建对话框
      

  2.   

    void CThreadTest1Dlg::OnBnClickedOk()
    {
    // TODO: 在此添加控件通知处理程序代码
    //OnOK();
     m_dwThreadID=0;
     m_hthread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE )Thread1,this,0,&m_dwThreadID);
    //WaitForSingleObject(hthread,INFINITE);
    }
    UINT   CThreadTest1Dlg::Thread1(LPVOID pParam)
    {
    CThreadTest1Dlg *pdlg=(CThreadTest1Dlg*)pParam;
             //无模式对话框弹出后,此线程被堵塞了,因为MessageBox在关闭前不返回,虽然主界面对话框和消息框可以前后切换,但子线程被堵塞,不会更新edit更新秒时
    //::MessageBox(NULL,"TEST",NULL,MB_OK);         //投递一个自定义消息,自定义消息响应弹出一个无模式对话框,不等待直接返回,主界面的Edit继续显示秒时走动。
    ::PostMessage(pdlg->GetSafeHwnd(),WM_MSGBOX,NULL,NULL);
    while(1)
    { CString str=CTime::GetCurrentTime().Format("%m:%S")+"\r\n";
    pdlg->m_Edit.SetWindowText(str); //cout << str << endl;
    Sleep(500);
    }
    }
    LRESULT CThreadTest1Dlg::OnMsgBox(WPARAM wParam,LPARAM lParam)
    {
    //自定义消息响应函数,弹出一个非模式对话框
    ::MessageBox(NULL,"TEST",NULL,MB_OK);
    return 0;
    }
    void CThreadTest1Dlg::OnBnClickedCancel()
    {
    // TODO: 在此添加控件通知处理程序代码
    CloseHandle(m_hthread);
    OnCancel();
    }