使用WM_QUIT终止线程

简介:

  下面是一个线程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,如需转载请自行联系原作者




相关文章
|
8月前
|
Shell Linux Windows
从您描述的情况来看,您在执行`exit`命令后,程序立即终止了
【2月更文挑战第32天】从您描述的情况来看,您在执行`exit`命令后,程序立即终止了
50 1
|
8月前
|
Windows
如何在关闭socket连接的时候跳过TIME_WAIT的等待状态
如何在关闭socket连接的时候跳过TIME_WAIT的等待状态
110 0
|
Shell
Shell 中断与退出(continue、break、exit)
Shell 中断与退出(continue、break、exit)
255 0
|
API
如何让一个线程“优雅”地退出
如何让一个线程“优雅”地退出
188 0
|
存储 物联网 Linux
Pthread_exit 线程退出|学习笔记
快速学习 Pthread_exit 线程退出
|
物联网 Linux 开发者
进程的终止 exit|学习笔记
快速学习进程的终止 exit
|
Java
线程的取消和中断
线程的取消和中断
149 0
|
Java 开发者
为什么不推荐使用 stop、suspend 方法中断线程?
我们知道像stop、suspend这几种中断或者阻塞线程的方法在较高java版本中已经被标记上了@Deprecated过期标签,那么为什么她们曾经登上了java的历史舞台而又渐渐的推出了舞台呢? 到底是人性的扭曲还是道德的沦丧呢,亦或是她们不思进取被取而代之呢,如果是被取而代之,那么取而代之的又是何方人也,本文我们将一探究竟。
253 0
为什么不推荐使用 stop、suspend 方法中断线程?
|
C++
C++学习007-使用exit退出进程
使用exit可以实现退出当前进程。
219 0
|
弹性计算 网络协议
为什么kill进程后socket一直处于FIN_WAIT_1状态
本文介绍一个因为conntrack内核参数设置和iptables规则设置的原因导致TCP连接不能正常关闭(socket一直处于FIN_WAIT_1状态)的案例,并介绍conntrack相关代码在conntrack表项超时后对新报文的处理逻辑。
3064 0

热门文章

最新文章

下一篇
开通oss服务