libuv實現timer時鐘庫
阿新 • • 發佈:2018-11-09
struct timer{
uv_timer_t uv_timer; //libuc timer handle
void(*on_timer)(void* udata);
void* udata;
int repeat_count; //-1是一直迴圈
};
alloc_timer函式是初始化一個timer資訊,通過uv_timer_init函式把timer加入到libuv事件管理裡面,on_uv_timer是整個timer的迴圈管理函式
struct timer* alloc_timer(void(*on_timer)(void* udata), void* udata, int repeat_count){ struct timer* t = (struct timer*)my_malloc(sizeof(struct timer)); memset(t, 0, sizeof(struct timer)); t->on_timer = on_timer; t->udata = udata; t->repeat_count = repeat_count; uv_timer_init(uv_default_loop(), &t->uv_timer); return t; } struct timer* schedule(void(*on_timer)(void* udata), void* udata, int after_msec, int repeat_count){ struct timer* t = alloc_timer(on_timer, udata, repeat_count); //libuv啟動一個timer t->uv_timer.data = t; uv_timer_start(&t->uv_timer, on_uv_timer, after_msec, after_msec); //end return t; }
int uv_timer_start(uv_timer_t* handle, uv_timer_cb cb, uint64_t timeout, uint64_t repeat);
引數一:uv_timer_t的控制代碼
引數二:timer執行的回撥函式
引數三:第一次多少秒後執行
引數四:後面多久重複一次
uv_timer_start(&timer_req, callback, 10000, 1000);
表示10秒後執行,之後每一秒執行一次
主要timer處理函式
static void on_uv_timer(uv_timer_t* handle){ struct timer* t = (struct timer*) handle->data; if (t->repeat_count < 0){ //一直重複執行 t->on_timer(t->udata); } else{ t->repeat_count--; t->on_timer(t->udata); if (t->repeat_count == 0){ //表是timer需要停止了 uv_timer_stop(&t->uv_timer); //停止這個timer free_timer(t); //釋放記憶體 } } }
判斷repeat_count小於0,則一直重複執行
否則timer->repeat_count--,然後執行timerz中的函式on_timer
判斷如果repeat_count等於0,表示重複次數已經執行完成,uv_timer_stop停止timer
使用方法
static void on_logger_timer(void* udata){
log_debug("hello world");
}
//3秒後執行on_logger_timer函式,-1表示一直重複執行
schedule(on_logger_timer, NULL, 3000, -1);