天天看點

使用WM_QUIT終止線程

  下面是一個線程1的函數: 

ThreadFun1  

{  

....// A  

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

  if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))  

  {  

    TranslateMessage(&msg);  

    DispatchMessage(&msg);  

  }  

...//B

線程1函數中有一個消息循環,現在想線上程2中使線程1終止,為了使線程2能夠自然退出,這裡向線程1投遞一個消息WM_QUIT,

::PostThreadMessage(dwThreadID1, WM_QUIT, 0, 0);

ThreadFun1的消息循環中GetMessage一旦收到WM_QUIT,就會退出循環。

那麼, 這樣做有什麼問題麼?

  有一個問題:如果線上程1擁有消息隊列之前向其投遞WM_QUIT,則該消息會丢失。也就是說若在ThreadFun1執行到GDI函數之前(線程執行GDI函數,OS會為線程建立消息隊列)向該線程投遞消息,ThreadFun1的消息循環收不到該消息。如何解決該問題呢?

  在ThreadFun1最前面加上:

MSG msg;

::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);

如此就能夠保證線程1能夠在消息循環中收到WM_QUIT消息。

本文轉自jetyi51CTO部落格,原文連結: http://blog.51cto.com/jetyi/471662,如需轉載請自行聯系原作者