在CWinThread派生类中挂起CreateDialogIndirect

时间:2010-09-23 07:20:13

标签: c++ multithreading winapi mfc

我是多线程的新手。

我创建了一个继承自CWinThread的类,名为CMyUIThread,还有一个名为CMyInfoDlg的对话框,它有一个文本和一个进度控制。我想在新创建的线程中显示无模式对话框。以下是部分代码:

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 个答案:

答案 0 :(得分:0)

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