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