天天看点

使用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,如需转载请自行联系原作者