Win32,等待主消息队列中的线程?

Posted

技术标签:

【中文标题】Win32,等待主消息队列中的线程?【英文标题】:Win32, wait for thread in main msg queue? 【发布时间】:2010-11-10 12:58:05 【问题描述】:

我在 WinMain 中创建了一个线程,然后我有一个经典的 msg 循环:

while(GetMessage(&msg, NULL, 0, 0))


    if (!done)
        GetExitCodeThread(dThread,&dwCode);
        if (dwCode!=STILL_ACTIVE)
            //thread done
        
    

if (!IsDialogMessage (UWnd, & msg))
    
        TranslateMessage ( & msg );
        DispatchMessage ( & msg );
    

这可以正常工作,但如果线程完成,它不会触发,直到窗口上的某些操作完成(鼠标、焦点等)。收到消息或线程结束时如何触发循环?

谢谢...

【问题讨论】:

【参考方案1】:

您可以让线程在完成时将消息发布到您的 UI 线程(使用 PostThreadMessage),而不是在消息循环中测试线程状态。那么您需要做的就是在 WindowProc 中处理该消息。

【讨论】:

线程消息无法在 WindowPoc 中处理,因为它们没有关联的窗口(它将被传递到哪个窗口过程?)。也就是说,您的建议将起作用,因为无需处理该消息,考虑到示例代码的结构,它已发布这一事实就足够了。【参考方案2】:

你看过 MsgWaitForMultipleObjectsEx 函数了吗?

【讨论】:

【参考方案3】:

线程句柄在线程终止时发出信号。因此,不要调用 GetMessage,而是调用 MsgWaitForMultipleObjects:返回值将指示某些消息可用 - 通过调用 PeekMessage 刷新所有消息,或者已发出句柄信号。

【讨论】:

以上是关于Win32,等待主消息队列中的线程?的主要内容,如果未能解决你的问题,请参考以下文章

Win32 消息队列有多深?

消息队列

在win32中的线程中向主窗口发送消息

基于条件变量的消息队列

ThreadX内核源码分析 - 消息队列

ThreadX内核源码分析 - 消息队列