时间轮任务定时器

 time_wheel.h

#include <memory>
#include <list>
#include <vector>
#include <mutex>
#include <thread>

typedef struct TimePos{
    int pos_ms;
    int pos_sec;
    int pos_min;
}TimePos_t;

typedef struct Event {
    int id;
    void(*cb)(void);
    void* arg;
    TimePos_t timePos;
    int interval;
    bool is_repeat;
}Event_t;


class TimeWheel {
    typedef std::shared_ptr<TimeWheel> TimeWheelPtr;
    typedef void (*EventCallback_t)(void );
    typedef std::vector<std::list<Event_t>> EventSlotList_t;
public:
    TimeWheel();
    ~TimeWheel();
    
    void initTimeWheel(int steps, int maxMin);
    int createTimingEvent(int interval, EventCallback_t callback, bool is_repeat = false);
    /**
     * @brief 取消定时任务
     * 
     * @param eventId 任务ID
     */
    void removeTimingEvent(int eventId);

    /**
     * @brief 打印现有任务ID
     */
    void printEvents();

    // 停止所有任务
    void stop();

    // 启动定时器
    bool start();

private:
    void loopForInterval();
    int getCurrentMs(TimePos_t timePos);
    int createEventId();
    int processEvent(std::list<Event_t> &eventList);
    void getTriggerTimeFromInterval(int interval, TimePos_t &timePos);
    void insertEventToSlot(int interval, Event_t& event);

    EventSlotList_t m_eventSlotList;
    TimePos_t m_timePos;
    std::unique_ptr<std::thread> m_loopThread = nullptr;

    int m_firstLevelCount;
    int m_secondLevelCount;
    int m_thirdLevelCount; 
    
    int m_steps;
    int m_increaseId;  // not used
    std::mutex m_mutex;
    bool m_isRunning;
};

time_wheel.cpp

#include "time_wheel.h"
#include "color_log.hpp"

#include <iostream>
#include <memory.h>
#include <chrono>
#include <algorithm>
#include <functional>

TimeWheel::TimeWheel() : m_steps(0), m_firstLevelCount(0), m_secondLevelCount(60), m_thirdLevelCount(0),
                         m_increaseId (1), m_isRunning(false){
                            memset(&m_timePos, 0, sizeof(m_timePos));
                         }

TimeWheel::~TimeWheel() {
    m_isRunning = false;
    if (m_loopThread && m_loopThread->joinable()) {
        m_loopThread->join();
    }  
}

void TimeWheel::loopForInterval() {
    log_debug("start TimeWheel loop !!!");
    while(m_isRunning) {
       std::this_thread::sleep_for(std::chrono::milliseconds(m_steps));
        // printf("唤醒\n");
        TimePos pos = {0};
        TimePos m_lastTimePos = m_timePos;
        // 更新当前 TimeWheel 的槽
        getTriggerTimeFromInterval(m_step
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值