头文件:
#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::StartEngine()
{
InitializeCriticalSection( &mTimerDetailsLock );
InitializeCriticalSection( &mTimerCallBacksLock );
mStopEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
mCallBackEvent = CreateSemaphore( NULL, 0, 0xFFFF, NULL );
if( NULL == mStopEvent || NULL == mCallBackEvent )
{
assert( false );
return false;
}
mpThread = new HANDLE[ 2 ];
mpThread[ 0 ] = reinterpret_cast< HANDLE >( _beginthreadex( NULL, 0, EngineThread, this, 0, NULL ) );
mpThread[ 1 ] = reinterpret_cast< HANDLE >( _beginthreadex( NULL, 0, CallBackThread, this, 0, NULL ) );
if( NULL == mpThread[ 0 ] || NUL

本文详细介绍了如何在C++中利用多线程技术实现一个功能完整的定时器,包括必要的头文件引用和测试案例,帮助读者理解并掌握C++多线程定时器的实现方法。

630

被折叠的 条评论
为什么被折叠?



