227 lines
4.5 KiB
C++
227 lines
4.5 KiB
C++
#pragma once
|
||
|
||
/*************************************
|
||
定时器管理,每个类都可以添加
|
||
**************************************/
|
||
/*
|
||
typedef struct tagTickMsg
|
||
{
|
||
INT_PTR nTimerID; //定时器的ID
|
||
TICKCOUNT nNextTick; //下次回调的时间嘀嗒
|
||
TICKCOUNT nFristTick; //第1次的定时器回调的时间
|
||
INT_PTR nInterval; //间隔,单位ms
|
||
}TICKMSG,*PTICKMSG;
|
||
|
||
class CTickAAA
|
||
{
|
||
public:
|
||
TICKCOUNT m_dwNextTick;
|
||
|
||
inline bool timeRiched(TICKCOUNT dwTick)
|
||
{
|
||
if ( dwTick >= m_dwNextTick )
|
||
{
|
||
m_dwNextTick += m_dwInterval;
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
};
|
||
|
||
class CAAA
|
||
{
|
||
CTickAAA m_SecondTick;
|
||
|
||
void run(TICKCOUNT dwCurrTick)
|
||
{
|
||
if ( m_SecondTick.timeRiched(dwCurrTick) )
|
||
{
|
||
foo1();
|
||
}
|
||
|
||
}
|
||
};
|
||
|
||
//内存管理器
|
||
|
||
|
||
class CTimerMgr
|
||
{
|
||
public:
|
||
CTimerMgr(){}
|
||
//每个继承这个类的执行一下这个函数,定时调用
|
||
VOID OnTimerRun()
|
||
{
|
||
//时间没有到
|
||
|
||
CLinkedNode<TICKMSG>* pNode = m_TimerList.enumFirst();
|
||
TICKCOUNT nCurrentTick = _getTickCount();
|
||
while(pNode )
|
||
{
|
||
if(pNode->m_Data.nFristTick && pNode->m_Data.nFristTick <= nCurrentTick)
|
||
{
|
||
OnTimer(pNode->m_Data.nTimerID); //调用
|
||
pNode->m_Data.nFristTick =0; //第1次调用结束
|
||
}
|
||
else if(pNode->m_Data.nNextTick <= nCurrentTick)
|
||
{
|
||
OnTimer(pNode->m_Data.nTimerID); //调用
|
||
pNode->m_Data.nNextTick = pNode->m_Data.nInterval + nCurrentTick;
|
||
}
|
||
|
||
pNode =m_TimerList.enumNext();
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
VOID AddTimer(INT_PTR nTimerID, INT_PTR nTickInterval,INT_PTR nFirstTickTime =0)
|
||
{
|
||
|
||
CLinkedNode<TICKMSG>* pNode = m_TimerList.enumFirst();
|
||
while(pNode )
|
||
{
|
||
if(pNode->m_Data.nTimerID == nTimerID) //已经有了
|
||
{
|
||
return;
|
||
}
|
||
pNode =m_TimerList.enumNext();
|
||
}
|
||
TICKMSG data;
|
||
data.nInterval = nTickInterval;
|
||
data.nNextTick =0;
|
||
data.nTimerID = nTimerID;
|
||
if(nFirstTickTime)
|
||
{
|
||
data.nFristTick = GetLogicServer()->GetLogicEngine()->getTickCount() + nFirstTickTime; //如果设置了第1次的时间,那么就
|
||
}
|
||
else
|
||
{
|
||
data.nFristTick =0;
|
||
}
|
||
m_TimerList.linkAtLast(data);
|
||
|
||
|
||
}
|
||
//删除定时器
|
||
VOID DelTimer(INT_PTR nTimerID)
|
||
{
|
||
|
||
CLinkedNode<TICKMSG>* pNode = m_TimerList.enumFirst();
|
||
while(pNode )
|
||
{
|
||
if(pNode->m_Data.nTimerID == nTimerID) //已经有了
|
||
{
|
||
m_TimerList.remove(pNode);
|
||
return;
|
||
}
|
||
pNode =m_TimerList.enumNext();
|
||
}
|
||
|
||
}
|
||
|
||
//定时器回调
|
||
virtual VOID OnTimer(INT_PTR nTimerID) =0;
|
||
|
||
//清除定时器
|
||
VOID ClearTimer()
|
||
{
|
||
m_TimerList.clear();
|
||
}
|
||
private:
|
||
CList<TICKMSG> m_TimerList; //定时器的
|
||
};
|
||
*/
|
||
|
||
extern TICKCOUNT GetLogicCurrTickCount() ;
|
||
|
||
template<int INTERVAL>
|
||
class CTimer
|
||
{
|
||
|
||
public:
|
||
CTimer()
|
||
{
|
||
//如果是逻辑服务器直接取当前的tick,其他服务器自己去取当前的时间,加快构造函数的速度
|
||
#ifdef __LOGIC_SERVER__
|
||
if (GetLogicCurrTickCount() == 0)
|
||
{
|
||
m_dwNextTick =_getTickCount() + INTERVAL; //说明CLogicEngine还没初始化
|
||
}
|
||
else
|
||
{
|
||
m_dwNextTick = GetLogicCurrTickCount() + INTERVAL;
|
||
}
|
||
|
||
|
||
#else
|
||
m_dwNextTick=_getTickCount() + INTERVAL;
|
||
#endif
|
||
}
|
||
|
||
|
||
//判断时间是否到达,如果到达则设置新的时间并返回true
|
||
// Param bool bIgnore: 是否忽略中间累积的处理。
|
||
inline bool CheckAndSet(TICKCOUNT dwCurrentTick, bool bIgnore = false)
|
||
{
|
||
if ( dwCurrentTick >= m_dwNextTick )
|
||
{
|
||
if (bIgnore)
|
||
m_dwNextTick = dwCurrentTick + INTERVAL;
|
||
else
|
||
m_dwNextTick += INTERVAL;
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
//判断时间是否到达
|
||
inline bool Check(TICKCOUNT dwCurrentTick)
|
||
{
|
||
return dwCurrentTick >= m_dwNextTick;
|
||
}
|
||
/*
|
||
增加一个接口,设置现在到下一次触发的间隔时间,这个主要用于跨天等特殊场合
|
||
* nNextTime 单位ms,表示下次触发是从现在开始的多少ms
|
||
*/
|
||
inline VOID SetNextHitTimeFromNow(INT_PTR nNextTime)
|
||
{
|
||
#ifdef __LOGIC_SERVER__
|
||
m_dwNextTick =GetLogicCurrTickCount() + nNextTime;
|
||
#else
|
||
m_dwNextTick = _getTickCount() + nNextTime;
|
||
#endif
|
||
|
||
}
|
||
inline void SetNextHitTime(TICKCOUNT nNextTime)
|
||
{
|
||
m_dwNextTick = nNextTime;
|
||
}
|
||
inline TICKCOUNT GetInterVal(TICKCOUNT dwCurrentTick)
|
||
{
|
||
return m_dwNextTick-dwCurrentTick;
|
||
}
|
||
inline TICKCOUNT GetNextTime()
|
||
{
|
||
return m_dwNextTick;
|
||
}
|
||
inline TICKCOUNT GetINTERVAL()
|
||
{
|
||
return INTERVAL;
|
||
}
|
||
//以当前时间为准重设下次时间
|
||
inline VOID Reset()
|
||
{
|
||
m_dwNextTick = GetLogicCurrTickCount() + INTERVAL;
|
||
}
|
||
//把定时器往后推一定的时间
|
||
inline void Delay(INT_PTR nTick)
|
||
{
|
||
m_dwNextTick += nTick;
|
||
}
|
||
private:
|
||
TICKCOUNT m_dwNextTick ;
|
||
|
||
//DECLARE_OBJECT_COUNTER(CTimer<INTERVAL>)
|
||
};
|