使用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
}

 

Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐