相關(guān)UML:

CTimerEngine成員變量:
//狀態(tài)變量
DWORD m_dwTimerSpace; //時間間隔,這個值后來應(yīng)該是給了定時器線程
protected:
bool m_bService; //運(yùn)行標(biāo)志
DWORD m_dwTimePass; //經(jīng)過時間
DWORD m_dwTimeLeave; //倒計時間
CTimerItemPtr m_TimerItemFree; //空閑數(shù)組
CTimerItemPtr m_TimerItemActive; //活動數(shù)組
這些是分析定時器線程函數(shù)需要了解的成員變量,其次是線程同步:
從代碼中可以看出所有對:m_TimerItemActive; m_TimerItemFree;的操作都是在一個線程鎖的保護(hù)之下的。
定時器線程:
通過CTimerThread繞一圈以后最終被循環(huán)執(zhí)行的實(shí)際上是這個函數(shù)(m_dwTimerSpace控制最小時間):
//定時器通知
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();)
{
//效驗(yàn)參數(shù)
pTimerItem=m_TimerItemActive[i];
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對象。