Files
mir_server/Gateway/srvlib/include/time/time_caller.h

128 lines
3.2 KiB
C
Raw Permalink Normal View History

2025-01-09 17:45:40 +08:00
#ifndef _TIME_CALL_H_
#define _TIME_CALL_H_
/************************************************************************
* <EFBFBD><EFBFBD>ʱ<EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ֧<EFBFBD>ְ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻص<EFBFBD><EFBFBD><EFBFBD>
* ʹ<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>нڵ<EFBFBD>ֻ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>Ľڵ<EFBFBD><EFBFBD><EFBFBD>ܱȽϸߣ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>Ӻ<EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD><EFBFBD><EFBFBD>O(n)
************************************************************************/
using namespace container;
class TimeCaller
{
public:
/*
* <EFBFBD><EFBFBD>ʱ<EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><EFBFBD><EFBFBD>
* data <EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* count ʣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD>Ϊ0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD>
*/
typedef void (*TimerCallBack)(void* data, int* count);
typedef void (*TimerCallerFree)(void* data);
typedef bool (*RemoveIf)(void* data);
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
***********************/
struct TIMECALLERNODE
{
int64_t guid_;
TimerCallBack callback_; //<2F>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
TimerCallerFree free_;
void* data_; //<2F>ص<EFBFBD><D8B5><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
int call_count_; //<2F><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD>
uint64_t next_t_;//<2F>´ε<C2B4><CEB5>õ<EFBFBD>ʱ<EFBFBD><CAB1>(TickCount)
uint64_t interval_; //<2F>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
bool remove_f_;//<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>Ƴ<EFBFBD>
bool call_detory_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ƿ<EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
TIMECALLERNODE(): guid_(0)
{
}
} ;
struct NEXTNODE
{
TimerCallBack callback_; //<2F>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
TimerCallerFree free_;
void* data_; //<2F>ص<EFBFBD><D8B5><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
bool call_detory_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ƿ<EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
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: ע<EFBFBD>ʱ<EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
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: <EFBFBD>Ƴ<EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Param HANDLE hTimedCall: <EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @Return BOOL: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳɹ<EFBFBD><EFBFBD>Ƴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TRUE<EFBFBD><EFBFBD><EFBFBD>򷵻<EFBFBD>FALSE
*/
bool RemoveTimeCaller(int64_t caller);
/*
* Comments: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>Ļص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @Return int: <EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˶<EFBFBD><EFBFBD>ٸ<EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
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_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ʱ<EFBFBD>򣬲<EFBFBD><F2A3ACB2><EFBFBD><EFBFBD>ټ<EFBFBD><D9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>caller
bool runing_next_; // <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>run next<78><74><EFBFBD><EFBFBD>
bool run_time_; // <20>Ƿ<EFBFBD><C7B7><EFBFBD>run time<6D><65><EFBFBD><EFBFBD>
bool run_time_clean_; // <20>Ƿ<EFBFBD><C7B7><EFBFBD>run time<6D>ڼ<EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD>clean<61><6E><EFBFBD><EFBFBD>
ListIterator<TIMECALLERNODE> run_list_iter_; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ListIterator<TIMECALLERNODE> new_list_iter_; //<2F>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int precision_; //<2F><><EFBFBD>о<EFBFBD><D0BE><EFBFBD>(<28><><EFBFBD><EFBFBD>)
uint64_t next_run_t_;
};
#endif