我在子线程中创建一个对话框:
BOOL CThread::InitInstance()
{
CMyDialog* pDlg=new CMyDialog;
         pDlg->Create(IDD_DIALOG1);
Sleep(5000);       
pDlg->ShowWindow(SW_SHOW);
m_pMainWnd=pDlg;
return TRUE;
}
只要把Sleep放到Create以后,主界面就会停止响应5秒钟。但如果把dialog换成framewnd的话就没有这个问题:
BOOL CThread::InitInstance()
{
CFrameWnd* pWnd=new CFrameWnd;
         pDlg->Create(NULL,"Frame Window");
Sleep(5000);                  //这时主界面正常
pWnd->ShowWindow(SW_SHOW);
m_pMainWnd=pWnd;
return TRUE;
}
谁能告诉我CDialog::Create倒底做了什么事,以至在它之后在子线程中Sleep会导致主线程停止响应?

解决方案 »

  1.   

    都等了5秒?用FrameWnd只有子线程会等5秒,主线程不会停止响应。但用dialog的话,主线程也会有5秒钟没反应。
      

  2.   

    大概是由于pParentWnd所导致的,对于CFrameWnd的Create中的pParentWnd是这样的:
    pParentWnd   Points to the parent window object (of type CWnd) to which the dialog object belongs. If it is NULL, the dialog object's parent window is set to the main application window.
    而CDialog的Create中的pParentWnd是这样的:
    pParentWnd   Specifies the parent window of this frame window. This parameter should be NULL for top-level frame windows.
    你可以将CMyDialog的属性中的POPUP改为Child试试还会不会有这种情况。
      

  3.   

    我这样试过了:
    CMyDialog* pDlg=new CMyDialog;
    pDlg->Create(IDD_DIALOG1,CWnd::FromHandle(AfxGetApp()->m_pMainWnd->m_hWnd);
    Sleep(5000);       
    还是一样,主线程无响应5秒。
      

  4.   

    agree to sans(sans) new CMyDialog(NULL)
      

  5.   

    奇怪,这样就不会无响应:m_pDlg = new CAboutDlg;
    m_pMainWnd = m_pDlg;
    m_pDlg->Create(CAboutDlg::IDD);
    Sleep(5000);
    m_pDlg->ShowWindow(SW_SHOWNOACTIVATE);这样就无响应了:m_pDlg = new CAboutDlg;
    m_pDlg->Create(CAboutDlg::IDD);
    Sleep(5000);
    m_pDlg->ShowWindow(SW_SHOWNOACTIVATE);
    m_pMainWnd = m_pDlg;应该是MFC的问题。
      

  6.   

    我估计是Create中间给AfxGetMainWnd取得的窗口Send了一个消息。用Spy++发现主窗口响应后得到了一个Send的WM_ACTIVATETOPLEVEL的消息。
      

  7.   

    会不会是对话框创建后还是隐藏的,改成BOOL CThread::InitInstance()
    {
    CMyDialog* pDlg=new CMyDialog;
             pDlg->Create(IDD_DIALOG1);
             pDlg->ShowWindow(SW_SHOW);
    Sleep(5000);       
    m_pMainWnd=pDlg;
    return TRUE;
    }试试
      

  8.   

    如果
    m_pDlg = new CAboutDlg;
    m_pMainWnd = m_pDlg;
    m_pDlg->Create(CAboutDlg::IDD);
    的话,在Create中用AfxGetMainWnd()得到的窗口(也就是dialog的父窗口)就是它m_pDlg本身。
    但如果
    m_pDlg = new CAboutDlg;
    m_pDlg->Create(CAboutDlg::IDD);
    Sleep(5000);
    m_pDlg->ShowWindow(SW_SHOWNOACTIVATE);
    m_pMainWnd = m_pDlg;
    的话,用AfxGetMainWnd得到的窗口就是程序的主窗口。这应该就是产生这种差别的根本原因。但我不明白父窗口的不同为什么会产生这种差别。
      

  9.   

    看来我要收回说的话了,调试时在无响应时Pause,子线程阻塞在Sleep,主线程阻塞在::GetMessage, 两种情况的区别确实如 webber84 所说,Parent为NULL就不会等待,Parent为主线程MainFrame就会引起主线程等待。不知道为什么主线程::GetMessage会阻塞?
      

  10.   


    BOOL CThread::InitInstance()
    {
    CMyDialog* pDlg=new CMyDialog;
             pDlg->Create(IDD_DIALOG1);
    Sleep(5000);       
    pDlg->ShowWindow(SW_SHOW);
    m_pMainWnd=pDlg;
    return TRUE;
    }
    改为BOOL CThread::InitInstance()
    {
    CMyDialog* pDlg=new CMyDialog;
    Sleep(5000);       
             pDlg->Create(IDD_DIALOG1);
    pDlg->ShowWindow(SW_SHOW);
    m_pMainWnd=pDlg;
    return TRUE;
    }
    试试看
      

  11.   

    我试过的,只要在Create以前就没事。
      

  12.   

    还有,如果我把对话框改为child风格,并用主界面窗口作它的主窗口,这时何对话框就不响应任何消息。PreTranslateMessage中明明收到了消息,可对话框就是不处理它。