关于c ++:CWinThread派生类中对CreateDialogIndirect的依赖

Hangs on CreateDialogIndirect in CWinThread derived class

我是多线程新手。

我从CWinThread继承了一个名为CMyUIThread的类,并创建了一个名为CMyInfoDlg的对话框,该对话框具有文本和进度ctrl。 我将在新创建的线程中显示无模式对话框。 下面是部分代码:

1
2
3
4
5
6
7
8
9
10
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;
}

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

1
2
3
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上。

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

我不知道为什么会这样。

有人知道为什么吗?


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