相關(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)過時(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í)器線程:
通過CTimerThread繞一圈以后最終被循環(huán)執(zhí)行的實(shí)際上是這個(gè)函數(shù)(m_dwTimerSpace控制最小時(shí)間):
//定時(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[i];
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í)間,從新開始倒計(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ì)象。