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