在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;
} 展开
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;
} 展开
2个回答
展开全部
CProgressDlg::IDD
这个没有资源ID吧。。没看到你哪赋值。而且父窗口也没给赋值
另外,没看出你的程序有必要用线程,即使有,也建议先用非线程调试好代码再加入,线程调试就是麻烦。还有不理解,你m_pMainWnd = m_pProgressDlg;做什么?子线程主窗口?很奇怪的应用。
这个没有资源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()函数。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询