博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用WM_QUIT终止线程
阅读量:7109 次
发布时间:2019-06-28

本文共 670 字,大约阅读时间需要 2 分钟。

  下面是一个线程1的函数: 

 
  1. ThreadFun1  
  2. {  
  3. ....// A  
  4. while (::GetMessage(&msg, NULL, 0, 0))  
  5. {  
  6.   if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))  
  7.   {  
  8.     TranslateMessage(&msg);  
  9.     DispatchMessage(&msg);  
  10.   }  
  11. ...//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,如需转载请自行联系原作者

你可能感兴趣的文章
Activity间用Intent和Bundle传递参数
查看>>
【C1】scala入门
查看>>
http请求状态码和请求信息的含义
查看>>
关于假设检验
查看>>
MapReduce原理(分布式计算模型)----------总结
查看>>
Linux学习笔记(九)--命令学习(文件与目录查看)
查看>>
2013最新Ghost Windows 7硬盘安装法详细(图文)教程
查看>>
centos6.5 安装mysql5.6多实例(多配置文件)
查看>>
Redis配置文件主要功能说明
查看>>
为什么要"去IOE"
查看>>
ubuntu 12.04安装mongodb+eclipse erlang plugin+erlang runtime
查看>>
arm-linux-gcc4.4.3编译s3c2410平台linux内核
查看>>
gitlab服务器
查看>>
我的友情链接
查看>>
Case_Compressed Mode_Background
查看>>
python 利用pexpect进行多机远程命令执行
查看>>
Python学习系列 (第一章):Python 的简介
查看>>
【转载】addShutdownHook的用处
查看>>
CSS3学习3----举例
查看>>
一个可以检测网络内主机类型的脚本
查看>>