windows平台下的高精度定时器

本文介绍了一个基于C++的简单定时器类CHTimer的实现。该定时器使用Windows API进行时间设置,并通过CHTimerListener接口更新监听者。文章详细展示了如何创建和管理定时器,包括启动和停止定时器的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class CHTimerListener
{
public:
    virtual void Update() = 0;
};

class CHTimer
{
public:
    CHTimer();
    ~CHTimer();
    bool start(CHTimerListener *listener, uint32_t _delay);
    void stop(CHTimerListener *listener);
    static CHTimer *get();
    static void release();
private:
    uint32_t m_PeriodMax;
};

 

#include <map>
#include <Windows.h>
#pragma comment(lib, "Winmm.lib")
#include "CHTimer.h"

CHTimer *g_instance = nullptr;
std::map<uint32_t, CHTimerListener *> g_listeners;

static void TimeProc(UINT uID, UINT UMsg, DWORD dwUser,
                     DWORD dw1, DWORD dw2)
{
    g_listeners[uID]->Update();
}

CHTimer::CHTimer()
{
    TIMECAPS TimeCap;
    ::timeGetDevCaps(&TimeCap, sizeof(TIMECAPS));
    TimeCap.wPeriodMax;
}

CHTimer *CHTimer::get()
{
    if (g_instance == nullptr)
    {
        g_instance = new CHTimer;
    }
    return g_instance;
}

void CHTimer::release()
{
    if (g_instance != nullptr)
    {
        delete g_instance;
        g_instance = nullptr;
    }
    if (!g_listeners.empty())
    {
        g_listeners.clear();
    }
}

bool CHTimer::start(CHTimerListener *listener, uint32_t _delay )
{
    bool Result = true;
    uint32_t m_Id;
    if ((m_Id = ::timeSetEvent(_delay, m_PeriodMax, (LPTIMECALLBACK)TimeProc,
                               (DWORD)(this), TIME_PERIODIC)) != NULL)
    {
        g_listeners.insert(std::map<uint32_t, CHTimerListener *>::value_type(m_Id, listener));
    }
    else
    {
        Result = false;
    }
    return Result;
}

void CHTimer::stop(CHTimerListener *listener)
{
    for (const auto &p : g_listeners)
    {
        if (p.second == listener)
        {
            ::timeKillEvent(p.first);
        }
    }
}

CHTimer::~CHTimer()
{
    for (const auto &p : g_listeners)
    {
        ::timeKillEvent(p.first);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值