在CWinThread中创建非模态对话框,父窗口是主窗口,主线程阻塞后,对话框的Create不返回了,为什么呢?

代码如下:BOOLCUIThread::InitInstance()//重写这个函数,很重要哦{if(m_pProgressDlg==NULL){m_pProgressD... 代码如下:
BOOL CUIThread::InitInstance() // 重写这个函数, 很重要哦
{
if( m_pProgressDlg==NULL )
{
m_pProgressDlg = new CProgressDlg(NULL);
}
if(m_pProgressDlg->GetSafeHwnd()==NULL)
{
m_pProgressDlg->Create( CProgressDlg::IDD, NULL ); //这个函数不会返回
}
m_pProgressDlg->ShowWindow(SW_SHOW);
//m_pProgressDlg->SetThread(m_nThreadID);
m_pMainWnd = m_pProgressDlg;
m_pEvent->SetEvent();
return TRUE;
}

启动线程的代码为:
CWnd* ProgressPub::StartProgress( CWnd* pParent /*= NULL*/ )
{
CEvent* pEvent = new CEvent(FALSE,TRUE);
CUIThread* pThread = (CUIThread*)AfxBeginThread(RUNTIME_CLASS (CUIThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
pThread->m_bAutoDelete = FALSE;
pThread->SetParent( pParent->GetSafeHwnd(), pEvent );
pThread->ResumeThread();
DWORD nResult = ::WaitForSingleObject( pEvent->m_hObject, INFINITE );
if( nResult==WAIT_OBJECT_0 )
{
return pThread->GetProgressWnd();
}
//delete pThread;
return NULL;
}
展开
 我来答
bhtzu
2012-07-07 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8088
采纳率:85%
帮助的人:4207万
展开全部
CProgressDlg::IDD
这个没有资源ID吧。。没看到你哪赋值。而且父窗口也没给赋值
另外,没看出你的程序有必要用线程,即使有,也建议先用非线程调试好代码再加入,线程调试就是麻烦。还有不理解,你m_pMainWnd = m_pProgressDlg;做什么?子线程主窗口?很奇怪的应用。
追问
CProgressDlg::IDD在ProgressDlg.h中有定义啊 
父窗口为NULL时,默认为是应用程序的主窗口,这个msdn上有说明,m_pMainWnd = m_pProgressDlg这句话去掉,效果也是一样的。
在线程中创建对话框,是因为主线程的处理过程比较长,消息循环没机会执行,所以m_pProgressDlg没机会刷新显示,因此将它放到单独的线程里面,因为windows的消息队列是针对线程的,所以m_pProgressDlg的消息函数不会受主线程影响,因此才能正常显示。
追答
你自己把可能都说完了,也不晒东西,让大伙怎么猜啊,呵呵
CProgressDlg::IDD在ProgressDlg.h中有定义啊//兄弟,定义的什么,晒晒呗
父窗口为NULL时,默认为是应用程序的主窗口//这个。。反正我不确定,你最好测试一下。
在线程中创建对话框,是因为主线程的处理过程比较长,消息循环没机会执行//可以偷懒的,关注OnIdle()函数。
chenghao0715
2013-09-01 · TA获得超过244个赞
知道答主
回答量:215
采纳率:0%
帮助的人:109万
展开全部
主线程阻塞,消息循环就进不来了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式