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

类别:VC语言 点击:0 评论:0 推荐:

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

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

}

 

本文地址:http://com.8s8s.com/it/it723.htm