windows api 封装的定时器
·
使用windows api 封装的一个简单的定时器类
代码如下:
#pragma once
#include <Windows.h>
namespace gdc
{
typedef void(*TimerCallback)(void *userData, unsigned long elapsed);
class Timer
{
public:
Timer(int interval, TimerCallback callback, void *userData);
~Timer();
inline bool IsActive() const { return m_timerId >= 0; }
__int64 GetTimerId() const { return m_timerId; }
// 设置或重置计时器时间
void SetInterval(int msec);
int GetInterval() const;
// 启动定时器,启动成功后回调函数按照指定的时间间隔定期触发
void Start();
// 停止定时器
void Stop();
private:
#ifdef _WINDOWS
static void CALLBACK TimerProc(HWND, UINT, UINT_PTR idEvent, DWORD dwTime);
#else
//请添加相应系统版本实现
#endif
private:
__int64 m_timerId;
int m_interval;
TimerCallback m_callback;
void * m_userData;
};
}
#include "Timer.h"
#include <Windows.h>
#include <map>
#ifdef _WINDOWS
static std::map<UINT_PTR, Timer*> TimerMap;
void CALLBACK Timer::TimerProc(HWND, UINT, UINT_PTR idEvent, DWORD dwTime)
{
std::map<UINT_PTR, GDCTimer*>::iterator it = TimerMap.find(idEvent);
if (it == TimerMap.end())
{
return;
}
Timer *t = it->second;
(*(t->m_callback))(t->m_userData, dwTime);
}
#else
//请添加相应系统版本实现
#endif
Timer::Timer(int interval, TimerCallback callback, void *userData)
: m_interval(interval)
, m_timerId(-1)
, m_callback(callback)
, m_userData(userData)
{
}
Timer::~Timer()
{
Stop();
}
void Timer::SetInterval(int msec)
{
#ifdef _WINDOWS
m_interval = msec;
if (IsActive())
{
::SetTimer(0, m_timerId, m_interval, &GDCTimer::TimerProc);
}
#endif
}
int Timer::GetInterval() const
{
return m_interval;
}
//! @brief 启动定时器,启动成功后回调函数按照指定的时间间隔定期触发
void Timer::Start()
{
#ifdef _WINDOWS
m_timerId = ::SetTimer(0, 0, m_interval, &GDCTimer::TimerProc);
if (m_timerId != 0)
{
TimerMap.insert(std::make_pair(m_timerId, this));
}
#endif
}
//! @brief 停止定时器
void Timer::Stop()
{
#ifdef _WINDOWS
if (m_timerId != -1)
{
if (::KillTimer(0, m_timerId))
{
std::map<UINT_PTR, GDCTimer*>::iterator it = TimerMap.find(m_timerId);
if (it != TimerMap.end())
{
TimerMap.erase(it);
}
m_timerId = -1;
}
}
#endif
}
更多推荐




所有评论(0)