如何暂停主线程直到第二个线程的终止?
http://www.codeproject.com/threads/waitthreadmsi.asp#xx441032xx
By Ybbozman
本文题目意思是:主线程要继续执行,必须先等待另一个线程的终止。如何等待另一个线程的终止,正是下文要讲述的。
简介Introduction
几周前,我需要制作一个对话框将它作为MSI安装程序的一部分,为此所写的代码必须是作为一个Regular(规则)DLL发布。这个对话框是否可见,完全依赖于安装完成的结果,该功能用另一个线程完成,安装完成后这个线程被终止,并最终显示这个对话框。
我从Microsoft那里寻求一些帮助,找到了正确解决方案:
解决
你必须写两个函数,第一个void CMyTestDialog::PeekMessageLoop() 将从消息队列中获取消息:
void CMyTestDialog::PeekMessageLoop()
{
MSG msg;
while (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
第二个, void CMyTestDialog::WaitForThreadToTerminate(HANDLE hThread) 将指示哪个线程需要等待并作进一步处理:
void CMyTestDialog::WaitForThreadToTerminate(HANDLE hThread)
{
DWORD dwRet;
do
{
dwRet = ::MsgWaitForMultipleObjects(1, &hThread, FALSE,
INFINITE, QS_ALLINPUT);
if (dwRet != WAIT_OBJECT_0)
{
PeekMessageLoop();
}
} while ((dwRet != WAIT_OBJECT_0) && (dwRet != WAIT_FAILED));
}
示例代码
假设对话框上有一个按钮,当点击按钮时,开始启动第二个线程,等到第二个线程完成后,我们再往下继续主线程:
void CMyTestDialog::OnButton1()
{
m_pUpdateThread = AfxBeginThread(UpdateDeviceContent,
(LPVOID)this/*, THREAD_PRIORITY_BELOW_NORMAL*/);
if (m_pUpdateThread)
{
WaitForThreadToTerminate(m_pUpdateThread->m_hThread);
}
//Do whatever you want after the action is finished
}