Files
mir_server/server/LogicServer/base/TimerMgr.h

227 lines
4.5 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#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 msms
*/
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>)
};