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

82 lines
2.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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