2010-11-10 39 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刷新任何消息,或者處理已被髮送信號。