void CDialogBasedDlg::OnButton1() 
{//主线程
// TODO: Add your control notification handler code here
AfxBeginThread(TestThread,NULL);
Sleep(5000);
}
UINT TestThread(LPVOID pParam)
{//辅助线程
g_dlg.DoModal();
// MessageBox(NULL,"ok","HELLO",MB_OK);
return 0;
}
代码如上,辅助线程中的对话框要5秒后才出现,而且SLEEP多少时间,他就多少时间后出现,
但是如果在辅助线程中,不显示对话框,而弹出MESSAGEBOX(),那么就马上运行。
这是为什么?

解决方案 »

  1.   

    因为Sleep挂起了当的执行的线程,
    MessageBox只是一个API函数.
      

  2.   

    DoModal的确是一个很奇怪的函数,有一些特性我也不清楚,只好帮你up一下了。
      

  3.   

    看看下面代码:
    UINT TestThread(LPVOID pParam)
    {//辅助线程
    // g_dlg.DoModal();
    // CDialogBasedDlg dlg;
    // dlg.DoModal();
    CDialogBasedDlg *dlg = (CDialogBasedDlg *) pParam;
    MessageBox(dlg->m_hWnd,"ok","HELLO",MB_OK);
    return 0;
    }void CDialogDlg::OnButton2() 
    {
    AfxBeginThread(TestThread,this);
    Sleep(5000);
    }
      

  4.   

    这时弹出MESSAGEBOX(),也要SLEEP多少时间,才出现
      

  5.   

    你的g_dlg是CDialogBasedDlg的实例吧?如果时,那就一定会出现你说的情况,虽然你在其他线程中调用CDialogBasedDlg,可是这时主线程里也会继续运行,运行到sleep时线程挂起了,就是你那个g_dlg被挂起了,所以你要等上你所sleep的时间。
      

  6.   

    不, g_dlg是另一个对话框的实例。
    另外,MESSAGEBOX()是马上就弹出来的,这个例子很简单,大家可以试试。
      

  7.   

    UINT TestThread(LPVOID pParam)
    {

    CDialogBasedDlg dlg;
    dlg.DoModal();
    return 0;
    }
    试试看。对于非UI线程你的代码好象有问题
      

  8.   

    yajunmao(oldcat) 说的对,我刚刚试了,当运行到DOMODAL()的时候就塞住了。
    要等主线程执行完,他才执行。这是为什么?
      

  9.   

    查查vc关于非UI线程的文档,具体我记不清了