//Callback.h #ifndef __CALLBACK_H__ #define __CALLBACK_H__ typedef void (*T_CallBack)(void *); typedef struct { T_CallBack cb; void *obj; }ST_CallBack; int __NewTimer(void* obj, int interval, bool isloop, T_CallBack cb); void __DeleteTimer(int handle); #define NewTimer(handle,obj,delay,isloop,CLASS,MEMBER) do{ \ union { T_CallBack cb; void (CLASS::*___M)(void); }___T; ___T.___M = &CLASS::MEMBER; handle = __NewTimer(obj, delay, isloop, ___T.cb); }while(0) #define DeleteTimer(handle) do{ if ( handle) { __DeleteTimer(handle); handle = 0; } }while(0) //#define NewTimer int TimerGetDelay(int handle); void TimerSetDelay(int handle, int delay); void TimerStart(int handle); void TimerStop(int handle); #endif
//Callback.cpp typedef struct { Uint32 lastticks; bool isloop; int delay; ST_CallBack cb; bool isdel; bool ispause; }ST_TimerTask; static std::list<ST_TimerTask*> timerTasks; int __NewTimer(void* obj, int delay, bool isloop, T_CallBack cb) { ST_TimerTask *task; NEW_OBJ(task, ST_TimerTask); task->isloop = isloop; task->delay = delay; task->cb.obj = obj; task->cb.cb = (T_CallBack)cb; task->lastticks = SDL_GetTicks(); task->isdel = false; task->ispause = false; timerTasks.push_back(task); return (int)task; } void __DeleteTimer(int handle) { std::list<ST_TimerTask*>::iterator iter; ST_TimerTask *task; for (iter = timerTasks.begin(); iter != timerTasks.end(); iter++) { task = (*iter); if ( (int)task == handle){ task->isdel = true; return; } } } void DeleteAllTimer(void) { std::list<ST_TimerTask*>::iterator iter; ST_TimerTask *task; for (iter = timerTasks.begin(); iter != timerTasks.end();) { task = (*iter); if ( task){ iter = timerTasks.erase(iter); DELETE_OBJ(task); }else iter++; } timerTasks.clear(); } void TimerRunning(Uint32 curticks) { std::list<ST_TimerTask*>::iterator iter; ST_TimerTask *task; for (iter = timerTasks.begin(); iter != timerTasks.end(); ) { task = (*iter); if ( task) { if(curticks - task->lastticks >= task->delay){ if ( task->isdel == false && task->ispause == false) task->cb.cb(task->cb.obj); if (task->isdel || task->isloop == false){ iter = timerTasks.erase(iter); DELETE_OBJ(task); continue; } task->lastticks = curticks; } } iter++; } } int TimerGetDelay(int handle) { ST_TimerTask *task=(ST_TimerTask*)handle; return task->delay; } void TimerSetDelay(int handle, int delay) { ST_TimerTask *task=(ST_TimerTask*)handle; task->delay = delay; } void TimerStart(int handle) { ST_TimerTask *task=(ST_TimerTask*)handle; task->ispause = false; } void TimerStop(int handle) { ST_TimerTask *task=(ST_TimerTask*)handle; task->ispause = true; }