网狐棋牌(四) TimerEngine
生活随笔
收集整理的這篇文章主要介紹了
网狐棋牌(四) TimerEngine
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
相關(guān)UML:
CTimerEngine成員變量:
? ??//狀態(tài)變量
? ? DWORD? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???m_dwTimerSpace;? ?? ?? ?? ?? ?? ???//時間間隔,這個值后來應(yīng)該是給了定時器線程
protected:
? ??bool? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???m_bService;? ?? ?? ?? ?? ?? ?? ?? ?//運行標志
? ? DWORD? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???m_dwTimePass;? ?? ?? ?? ?? ?? ???//經(jīng)過時間
? ? DWORD? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???m_dwTimeLeave;? ?? ?? ?? ?? ?? ???//倒計時間
? ? CTimerItemPtr? ?? ?? ?? ?? ?? ?? ?? ?m_TimerItemFree;? ?? ?? ?? ?? ??//空閑數(shù)組
? ? CTimerItemPtr? ?? ?? ?? ?? ?? ?? ?? ?m_TimerItemActive;? ?? ?? ?? ?? ??//活動數(shù)組
這些是分析定時器線程函數(shù)需要了解的成員變量,其次是線程同步:
從代碼中可以看出所有對:m_TimerItemActive;??m_TimerItemFree;的操作都是在一個線程鎖的保護之下的。
定時器線程:
通過CTimerThread繞一圈以后最終被循環(huán)執(zhí)行的實際上是這個函數(shù)(m_dwTimerSpace控制最小時間):
[cpp]?view plaincopy //定時器通知?? void?CTimerEngine::OnTimerThreadSink()?? {?? ????//鎖定資源?? ????CThreadLockHandle?LockHandle(&m_ThreadLock);?? ?? ????//倒計時間?? ????if?(m_dwTimeLeave==NO_TIME_LEFT)??? ????{?? ????????ASSERT(m_TimerItemActive.GetCount()==0);?? ????????return;?? ????}?? ?? ????//減少時間?? ????ASSERT(m_dwTimeLeave>=m_dwTimerSpace);?? ????m_dwTimeLeave-=m_dwTimerSpace;?? ????m_dwTimePass+=m_dwTimerSpace;?? ?? ????//查詢定時器?? ????if?(m_dwTimeLeave==0)?? ????{?? ????????bool?bKillTimer=false;?? ????????tagTimerItem?*?pTimerItem=NULL;?? ????????DWORD?dwTimeLeave=NO_TIME_LEFT;?? ????????for?(INT_PTR?i=0;i<m_TimerItemActive.GetCount();)?? ????????{?? ????????????//效驗參數(shù)?? ????????????pTimerItem=m_TimerItemActive;?? ????????????ASSERT(pTimerItem!=NULL);?? ????????????ASSERT(pTimerItem->dwTimeLeave>=m_dwTimePass);?? ?? ????????????//定時器處理?? ????????????bKillTimer=false;?? ????????????//?這一行做了--操作?? ????????????pTimerItem->dwTimeLeave?-=?m_dwTimePass;?? ????????????if?(pTimerItem->dwTimeLeave==0L)?? ????????????{?? ????????????????//發(fā)送通知?? ????????????????m_AttemperEvent.PostTimerEvent(pTimerItem->wTimerID,pTimerItem->wBindParam);?? ?? ????????????????//設(shè)置次數(shù)?? ????????????????if?(pTimerItem->dwRepeatTimes!=TIMER_REPEAT_TIMER)?? ????????????????{?? ????????????????????ASSERT(pTimerItem->dwRepeatTimes>0);?? ????????????????????if?(pTimerItem->dwRepeatTimes==1L)?? ????????????????????{?? ????????????????????????bKillTimer=true;?? ????????????????????????m_TimerItemActive.RemoveAt(i);?? ????????????????????????m_TimerItemFree.Add(pTimerItem);?? ????????????????????}?? ????????????????????else?pTimerItem->dwRepeatTimes--;?? ????????????????}?? ?? ????????????????//設(shè)置時間,從新開始倒計時?? ????????????????if?(bKillTimer==false)?pTimerItem->dwTimeLeave=pTimerItem->dwElapse;?? ????????????}?? ?? ????????????//增加索引?? ????????????if?(bKillTimer==false)??? ????????????{?? ????????????????i++;?? ????????????????dwTimeLeave=__min(dwTimeLeave,pTimerItem->dwTimeLeave);?? ????????????????ASSERT(dwTimeLeave%m_dwTimerSpace==0);?? ????????????}?? ????????}?? ?? ????????//設(shè)置響應(yīng)?? ????????m_dwTimePass=0L;?? ????????m_dwTimeLeave=dwTimeLeave;?? ????}?? ?? ????return;?? }??
CTimerEngine:
啟動一個定時器線程,循環(huán)遍歷定時器,如果發(fā)現(xiàn)滿足出發(fā)條件的定時器就投遞一個定時器消息到CQueueServiceEvent對象。
CTimerEngine成員變量:
? ??//狀態(tài)變量
? ? DWORD? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???m_dwTimerSpace;? ?? ?? ?? ?? ?? ???//時間間隔,這個值后來應(yīng)該是給了定時器線程
protected:
? ??bool? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???m_bService;? ?? ?? ?? ?? ?? ?? ?? ?//運行標志
? ? DWORD? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???m_dwTimePass;? ?? ?? ?? ?? ?? ???//經(jīng)過時間
? ? DWORD? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???m_dwTimeLeave;? ?? ?? ?? ?? ?? ???//倒計時間
? ? CTimerItemPtr? ?? ?? ?? ?? ?? ?? ?? ?m_TimerItemFree;? ?? ?? ?? ?? ??//空閑數(shù)組
? ? CTimerItemPtr? ?? ?? ?? ?? ?? ?? ?? ?m_TimerItemActive;? ?? ?? ?? ?? ??//活動數(shù)組
這些是分析定時器線程函數(shù)需要了解的成員變量,其次是線程同步:
從代碼中可以看出所有對:m_TimerItemActive;??m_TimerItemFree;的操作都是在一個線程鎖的保護之下的。
定時器線程:
通過CTimerThread繞一圈以后最終被循環(huán)執(zhí)行的實際上是這個函數(shù)(m_dwTimerSpace控制最小時間):
[cpp]?view plaincopy
啟動一個定時器線程,循環(huán)遍歷定時器,如果發(fā)現(xiàn)滿足出發(fā)條件的定時器就投遞一個定時器消息到CQueueServiceEvent對象。
總結(jié)
以上是生活随笔為你收集整理的网狐棋牌(四) TimerEngine的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网狐棋牌(三) 调度引擎初步分析
- 下一篇: 网狐棋牌(五) TCPSocketEng