128 lines
3.2 KiB
C++
128 lines
3.2 KiB
C++
#ifndef _TIME_CALL_H_
|
||
#define _TIME_CALL_H_
|
||
|
||
/************************************************************************
|
||
* 定时回调函数类
|
||
* 支持按间隔毫秒数以及指定日期时间点的周期回调。
|
||
* 使用的是排序的链表算法,执行节点只需要遍历前面达到时间的节点,性能比较高,到时增加和删除都需要遍历
|
||
* 链表,性能都是O(n)
|
||
************************************************************************/
|
||
using namespace container;
|
||
|
||
class TimeCaller
|
||
{
|
||
public:
|
||
/*
|
||
* 定时回调函数类型定义
|
||
* data 回调数据,数据由注册时传递
|
||
* count 剩余调用的次数,调用后变为0则会从队列中删除
|
||
*/
|
||
typedef void (*TimerCallBack)(void* data, int* count);
|
||
typedef void (*TimerCallerFree)(void* data);
|
||
typedef bool (*RemoveIf)(void* data);
|
||
|
||
/**
|
||
* 定义回调函数注册信息
|
||
***********************/
|
||
struct TIMECALLERNODE
|
||
{
|
||
int64_t guid_;
|
||
TimerCallBack callback_; //回调函数指针
|
||
TimerCallerFree free_;
|
||
void* data_; //回调数据,数据由注册时传递
|
||
int call_count_; //调用次数
|
||
uint64_t next_t_;//下次调用的时间(TickCount)
|
||
uint64_t interval_; //回调周期
|
||
bool remove_f_;//是否标记为移除
|
||
bool call_detory_; // 在析构的时候是否要调用
|
||
TIMECALLERNODE(): guid_(0)
|
||
{
|
||
|
||
}
|
||
} ;
|
||
struct NEXTNODE
|
||
{
|
||
TimerCallBack callback_; //回调函数指针
|
||
TimerCallerFree free_;
|
||
void* data_; //回调数据,数据由注册时传递
|
||
bool call_detory_; // 在析构的时候是否要调用
|
||
bool remove_f_;
|
||
};
|
||
public:
|
||
typedef Vector<NEXTNODE> NextList;
|
||
typedef LinkedListEx<TIMECALLERNODE> TimeList;
|
||
|
||
struct BaseCallerList
|
||
{
|
||
TimeList list_;
|
||
int remove_count_;
|
||
BaseCallerList(): remove_count_(0)
|
||
{
|
||
|
||
}
|
||
};
|
||
public:
|
||
TimeCaller(BaseAllocator* alloc);
|
||
virtual ~TimeCaller()
|
||
{
|
||
ClearAllCaller();
|
||
}
|
||
|
||
void ClearAllCaller();
|
||
|
||
/*
|
||
* Comments: 注册定时回调对象
|
||
*/
|
||
int64_t AddTimeCaller(TimerCallBack callerfunc, TimerCallerFree freef,
|
||
void* data, uint64_t next_t, int count = 1, uint64_t interv = 0, bool call_destory = false);
|
||
bool AddNext(TimerCallBack callerfunc, TimerCallerFree freef, void* data, bool call_destory = false);
|
||
/*
|
||
* Comments: 移除回调函数
|
||
* Param HANDLE hTimedCall: 回调对象句柄
|
||
* @Return BOOL: 如果回调对象存在且成功移除则函数返回TRUE否则返回FALSE
|
||
*/
|
||
bool RemoveTimeCaller(int64_t caller);
|
||
|
||
/*
|
||
* Comments: 检查并调用已经到达运行时间的回调对象
|
||
* @Return int: 返回检查了多少个回调对象
|
||
*/
|
||
int Run(uint64_t now_t);
|
||
|
||
void RemoveAllIf(RemoveIf func);
|
||
|
||
void SetPrecision(int precision) { precision_ = precision; }
|
||
private:
|
||
bool RemoveTimeCaller(TimeList* list, int64_t caller);
|
||
void Swap();
|
||
void RunAllNext(NextList* list, bool destory = false);
|
||
void RunAllTime(TimeList* list);
|
||
|
||
void RemoveNextIf(NextList* list, RemoveIf func);
|
||
void RemoveTimeIf(BaseCallerList* list, RemoveIf func);
|
||
private:
|
||
NextList next_list1_;
|
||
NextList next_list2_;
|
||
|
||
NextList* run_next_;
|
||
|
||
|
||
BaseCallerList new_list_;
|
||
BaseCallerList run_list_;
|
||
int64_t id_;
|
||
|
||
bool cleaning_; // 在清除所有数据的时候,不能再继续添加新caller
|
||
bool runing_next_; // 是否正在run next队列
|
||
bool run_time_; // 是否在run time队列
|
||
bool run_time_clean_; // 是否在run time期间执行了clean操作
|
||
|
||
ListIterator<TIMECALLERNODE> run_list_iter_; //运行链表迭代器
|
||
ListIterator<TIMECALLERNODE> new_list_iter_; //新建链表迭代器
|
||
|
||
int precision_; //运行精度(毫秒)
|
||
uint64_t next_run_t_;
|
||
};
|
||
|
||
#endif
|
||
|