事件迴圈Loop
libuv 高精度timer
1: 建立一個timer 請求:
uv_timer_init(uv_default_loop(), &timer_handle);
2: 添加一個定時器:
uv_timer_start(&timer_handle, timer_callback, msec, 1);
3: 取消一個定時器:
uv_timer_stop();
擷取系統已耗用時間
#ifdef WIN32#include <windows.h>static unsigned intget_cur_ms() { return GetTickCount();}#else#include <sys/time.h> #include <time.h> #include <limits.h>static unsigned intget_cur_ms() { struct timeval tv; // struct timezone tz; gettimeofday(&tv, NULL); return ((tv.tv_usec / 1000) + tv.tv_sec * 1000);}#endif
設計timer系統
1:unsigned int schedule(void(*on_timer)(void* udata), void* udata, float after_sec, int repeat);2:void cancel_timer(unsigned int timeid) ;3:unsigned int schedule_once(void(*on_timer)(void* udata), void* udata, float after_sec);
建立標頭檔與庫
標頭檔
介面庫檔案
#include <stdio.h>#include <string.h>#include <stdlib.h>#include "uv.h"#include "timer_list.h"#define my_malloc malloc#define my_free freestruct timer{ uv_timer_t uv_timer;//libuv timer handle void(*on_timer)(void* udata); void* udata; int repeat_count; //-1 是一直迴圈;};static struct timer* alloc_timer(void(*on_timer)(void* udata), void* udata, int repeat_count){ struct timer* t = my_malloc(sizeof(struct timer)); memset(t, 0, sizeof(struct timer)); t->on_timer = on_timer; t->repeat_count = repeat_count; t->udata = udata; uv_timer_init(uv_default_loop(),&t->uv_timer); return t;}static voidfree_timer(struct timer* t){ my_free(t);}static void on_uv_timer(uv_timer_t* handle){ struct timer* t = 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); } }}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); //啟動一個timer; t->uv_timer.data = t; uv_timer_start(&t->uv_timer, on_uv_timer, after_msec, after_msec); return t;}voidcancel_timer(struct timer* t){ if (t->repeat_count == 0){ //全部觸發完成 return; } uv_timer_stop(&t->uv_timer); free_timer(t);}struct timer*schedule_once(void(*on_timer)(void* udata), void* udata, int after_msec){ return schedule(on_timer,udata,after_msec,1);}
調試Debug
隔5秒就調用,調用5次
每隔1秒就調用
自訂調用次數,後釋放記憶體
調用中,插入一次
Code