头文件:
#pragma once
#include <Windows.h>
#include <map>
#include <queue>
//回调接口
typedef struct ITimerEngineCallBack
{
virtual bool OnTimerEngineCallBack( DWORD TimerID, DWORD Param ) = 0;
}* ITimerEngineCallBackPtr;
class TimerEngine
{
public:
TimerEngine();
virtual ~TimerEngine();
//启动定时器引擎
bool StartEngine();
//停止定时器引擎
bool StopEngine();
//添加定时器( 不同的回调里面不用考虑TimerID重复的问题 )
bool AddTimer( ITimerEngineCallBackPtr pCallBack, DWORD TimerID, DWORD Interval = 1000, DWORD Times = 1, DWORD Param = 0 );
//删除定时器
bool KillTimer( ITimerEngineCallBackPtr pCallBack, DWORD TimerID );
private:
//添加一个回调
bool AddCallBack( ITimerEngineCallBackPtr pCallBack, DWORD TimerID, DWORD Param );
//引擎线程
static UINT WINAPI EngineThread( LPVOID P );
//回调线程
static UINT WINAPI CallBackThread( LPVOID P );
private:
//定时器数据
struct TimerDetail
{
DWORD mTimerID;
DWORD mInterval;
DWORD mTimes;
DWORD mParam;
DWORD mTick;
};
//执行数组
typedef std::multimap< ITimerEngineCallBackPtr, TimerDetail > TimerDetails;
typedef TimerDetails::iterator TimerDetailsIterator;
TimerDetails mTimerDetails;
//执行锁
CRITICAL_SECTION mTimerDetailsLock;
//停止事件
HANDLE mStopEvent;
//回调事件
HANDLE mCallBackEvent;
//回调数据
struct TimerCallBack
{
ITimerEngineCallBackPtr mpCallBack;
DWORD mTimerID;
DWORD mParam;
};
//回调队列
std::queue< TimerCallBack > mTimerCallBacks;
//回调锁
CRITICAL_SECTION mTimerCallBacksLock;
//线程指针
LPHANDLE mpThread;
};
源文件:
#include "TimerEngine.h"
#include <process.h>
#include <assert.h>
enum eTime
{
ePRECISION = 32, //定时器精度,越小精度越高当然消耗CPU越高,根据实际情况调整
eTHREAD_TIME_OUT = 1024, //线程超时时间
};
TimerEngine::TimerEngine()
{}
TimerEngine::~TimerEngine()
{}
bool TimerEngine::StartEngin