事件循环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 int
get_cur_ms() {
return GetTickCount();
}
#else
#include <sys/time.h>
#include <time.h>
#include <limits.h>
static unsigned int
get_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 free
struct 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 void
free_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;
}
void
cancel_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秒就调用
自定义调用次数,后释放内存
调用中,插入一次