代码之家  ›  专栏  ›  技术社区  ›  wengseng

挂起CWinThread派生类中的CreateDialogIndirect

  •  0
  • wengseng  · 技术社区  · 15 年前

    我创建了一个从CWinThread继承的类CMyUIThread,以及一个名为CMyInfoDlg的对话框,其中包含一个文本和一个进度ctrl。我想在新创建的线程中显示无模式对话框。以下是部分代码:

    BOOL CMyUIThread::InitInstance()
    {
    // TODO: perform and per-thread initialization here
    // NOTE: the memory allocated below is freed by CMyInfoDlg::OnDestroy (it deletes itself)
    m_pDlg = new CMyInfoDlg(CWnd::FromHandle(m_hwndParent));
    VERIFY( m_pDlg->Create(IDD_THREADUI_DIALOG, CWnd::FromHandle(m_hwndParent)) );
    g_hwndProgress = m_pDlg->GetSafeHwnd();
    ::ShowWindow(g_hwndProgress, SW_SHOW); // show window for the first time
    return TRUE;
    }
    

    在我的主要框架中,我做了以下工作

    m_pThread = new CGSUIThread(m_hwndParent);
    m_pThread->m_bAutoDelete = FALSE;
    VERIFY( m_pThread->CreateThread() );
    

    好 啊。在这种情况下,它可以正常工作。

    然而,当我将它合并到另一个具有主框架的大模块中时,问题来了:它挂起了:
    VERIFY( m_pDlg->Create(IDD_THREADUI_DIALOG, CWnd::FromHandle(m_hwndParent)) );
    当我追踪时,它实际上挂在CreateIndirectDialog上。

    BOOL CDialog::Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd)
    

    我不知道为什么会这样。

    1 回复  |  直到 15 年前
        1
  •  0
  •   Nick    15 年前

    最佳建议:检查调用堆栈。您可以从MS服务器获取公共Windows符号,并查看具体挂起的内容。最好的猜测可能是消息传递死锁,或者可能与CWnd*有关。不过,得看看调用堆栈,看看到底有什么悬而未决的。