如何暂停主线程直到第二个线程的终止?

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

如何暂停主线程直到第二个线程的终止?

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

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航