网狐棋牌(四) TimerEngine

相关UML:


CTimerEngine成员变量:
    //状态变量
    DWORD                                m_dwTimerSpace;                    //时间间隔,这个值后来应该是给了定时器线程
protected:
    
bool                                m_bService;                        //运行标志
    DWORD                                m_dwTimePass;                    //经过时间
    DWORD                                m_dwTimeLeave;                    //倒计时间
    CTimerItemPtr                        m_TimerItemFree;                //空闲数组
    CTimerItemPtr                        m_TimerItemActive;                //活动数组

这些是分析定时器线程函数需要了解的成员变量,其次是线程同步:
从代码中可以看出所有对:m_TimerItemActive;  m_TimerItemFree;的操作都是在一个线程锁的保护之下的。


定时器线程:
通过CTimerThread绕一圈以后最终被循环执行的实际上是这个函数(m_dwTimerSpace控制最小时间):
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //定时器通知  
  2. void CTimerEngine::OnTimerThreadSink()  
  3. {  
  4.     //锁定资源  
  5.     CThreadLockHandle LockHandle(&m_ThreadLock);  
  6.   
  7.     //倒计时间  
  8.     if (m_dwTimeLeave==NO_TIME_LEFT)   
  9.     {  
  10.         ASSERT(m_TimerItemActive.GetCount()==0);  
  11.         return;  
  12.     }  
  13.   
  14.     //减少时间  
  15.     ASSERT(m_dwTimeLeave>=m_dwTimerSpace);  
  16.     m_dwTimeLeave-=m_dwTimerSpace;  
  17.     m_dwTimePass+=m_dwTimerSpace;  
  18.   
  19.     //查询定时器  
  20.     if (m_dwTimeLeave==0)  
  21.     {  
  22.         bool bKillTimer=false;  
  23.         tagTimerItem * pTimerItem=NULL;  
  24.         DWORD dwTimeLeave=NO_TIME_LEFT;  
  25.         for (INT_PTR i=0;i<m_TimerItemActive.GetCount();)  
  26.         {  
  27.             //效验参数  
  28.             pTimerItem=m_TimerItemActive;  
  29.             ASSERT(pTimerItem!=NULL);  
  30.             ASSERT(pTimerItem->dwTimeLeave>=m_dwTimePass);  
  31.   
  32.             //定时器处理  
  33.             bKillTimer=false;  
  34.             // 这一行做了--操作  
  35.             pTimerItem->dwTimeLeave -= m_dwTimePass;  
  36.             if (pTimerItem->dwTimeLeave==0L)  
  37.             {  
  38.                 //发送通知  
  39.                 m_AttemperEvent.PostTimerEvent(pTimerItem->wTimerID,pTimerItem->wBindParam);  
  40.   
  41.                 //设置次数  
  42.                 if (pTimerItem->dwRepeatTimes!=TIMER_REPEAT_TIMER)  
  43.                 {  
  44.                     ASSERT(pTimerItem->dwRepeatTimes>0);  
  45.                     if (pTimerItem->dwRepeatTimes==1L)  
  46.                     {  
  47.                         bKillTimer=true;  
  48.                         m_TimerItemActive.RemoveAt(i);  
  49.                         m_TimerItemFree.Add(pTimerItem);  
  50.                     }  
  51.                     else pTimerItem->dwRepeatTimes--;  
  52.                 }  
  53.   
  54.                 //设置时间,从新开始倒计时  
  55.                 if (bKillTimer==false) pTimerItem->dwTimeLeave=pTimerItem->dwElapse;  
  56.             }  
  57.   
  58.             //增加索引  
  59.             if (bKillTimer==false)   
  60.             {  
  61.                 i++;  
  62.                 dwTimeLeave=__min(dwTimeLeave,pTimerItem->dwTimeLeave);  
  63.                 ASSERT(dwTimeLeave%m_dwTimerSpace==0);  
  64.             }  
  65.         }  
  66.   
  67.         //设置响应  
  68.         m_dwTimePass=0L;  
  69.         m_dwTimeLeave=dwTimeLeave;  
  70.     }  
  71.   
  72.     return;  
  73. }  
CTimerEngine:
启动一个定时器线程,循环遍历定时器,如果发现满足出发条件的定时器就投递一个定时器消息到CQueueServiceEvent对象。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值