CodeFree/6_solution/高性能定时器/最小堆定时器/timer_common.hpp

82 lines
2.3 KiB
C++
Raw Normal View History

2024-12-26 13:57:27 +08:00
#ifndef _LIB_SRC_TIMER_COMMON_H_
#define _LIB_SRC_TIMER_COMMON_H_
#include <cstddef>
#include <cstdio>
#include <sys/time.h>
// 获取时间戳 单位:毫秒
time_t getMsec() {
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec * 1000 + tv.tv_usec / 1000;
// 秒乘1000微妙除1000返回的是毫秒
}
// 定时器数据结构的定义
template <typename _User_Data>
class Timer {
public:
Timer() : _user_data(nullptr), _cb_func(nullptr) {}
Timer(int msec) : _user_data(nullptr), _cb_func(nullptr) {
this->_expire = getMsec() + msec;
}
~Timer() {}
void setTimeout(time_t timeout) {
this->_expire = getMsec() + timeout;
}
time_t getExpire() {
return _expire;
}
void setUserData(_User_Data* userData) {
this->_user_data = userData;
}
void handleTimeout() {
if (_cb_func) {
_cb_func(_user_data);
}
}
using TimeOutCbFunc = void (*)(_User_Data*);
void setCallBack(TimeOutCbFunc callback) {
this->_cb_func = callback;
}
private:
time_t _expire; // 定时器生效的绝对时间
_User_Data* _user_data; // 用户数据
TimeOutCbFunc _cb_func; // 超时的回调函数
};
/*
Timer就是一个简单的定时器
expire
*/
// 定时器容器
template <typename _UData>
class ITimerContainer {
public:
ITimerContainer() = default;
virtual ~ITimerContainer() = default;
public:
virtual void tick() = 0; // 时间标记提醒(滴答)
virtual Timer<_UData>* addTimer(time_t timeout) = 0;
virtual void delTimer(Timer<_UData>* timer) = 0;
virtual void resetTimer(Timer<_UData>* timer, time_t timeout) = 0;
virtual int getMinExpire() = 0;
};
/*
I IContainer Interface
*/
#endif