2010-11-10 37 views
0

我在WinMain函数创建一个线程,之后我有一个经典消息循环:Win32,等待主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); 
    } 
} 

这工作不错,但如果线程结束,也不会触发,直到窗口上的某些操作完成后(鼠标,焦点等)。当收到消息或线程完成时,如何获得循环触发器?

谢谢...

回答

5

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

+0

谢谢,这正是我所做的,完美的工作:) – Marin 2010-11-10 14:30:15

+0

线程消息无法在WindowPoc中处理,因为它们没有关联的窗口(将窗口过程传递给?)。也就是说,你的建议将起作用,因为没有必要处理这个消息,考虑到示例代码的结构,它的发布已经足够了。 – Steve 2010-11-16 14:28:53

2

你已经采取了看看MsgWaitForMultipleObjectsEx功能?

1

当线程终止时,线程句柄会变成信号。因此,不是调用GetMessage,而是调用MsgWaitForMultipleObjects:返回值将指示某些消息可用 - 通过调用PeekMessage刷新任何消息,或者处理已被发送信号。