128 lines
3.2 KiB
C
128 lines
3.2 KiB
C
|
|
#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
|
|||
|
|
|