Windows中子线程不能触发定时器的问题分析

对窗口来说,都会有一个消息循环线程(此消息线程即UI线程)执行各类任务,一般情况此线程大部分时间都处于空闲状态,由消息泵等待消息触发各类操作(如界面刷新、定时器响应等),除非窗口退出,不然不会退出此线程。

在窗口线程或主线程中使用定时器由于有消息泵等待定时器消息,所以不会存在不响应定时器的情况。但子线程在创建时一般不需要消息泵,所以按顺序执行完后直接退出,就算是有定时器需要触发,子线程也不知道,所以等定时器Timeout时,并不会达到触发的目的。


解决办法

1、所有触发定时器的操作转到主线程执行

此方法是碰到此问题时首先想到的解决方法,也是简单可行的,但某些情况可能就要改变定时器的触发方式,在修改时会比较花时间。最关键的是:此方法是在逃避问题而不是迎接问题。

2、在子线程加入消息泵

问题的本质也清楚了,那在子线程中加入消息泵即可完美解决此类问题。需要在有触发定时器的线程中加入PeekMsg()函数(代码如下),如果响应完后退出线程,直接在响应过程后退出while循环可以达到目的。

void PeekMsg()
{
   MSG msg;
   PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
   while(1)
   {
      if(GetMessage(&msg, NULL, 0, 0))
      {
         switch(msg.message)
         case WM_TIMER:
         {
              ::DispatchMessage(&msg);
              break;
         }    
      }
   }
}

经验证,以上方法是正确的,但需要根据实际问题进行一些调整完善。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值