libuv实现timer时钟库

版权声明: https://blog.csdn.net/qq_28710983/article/details/83064347

 

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);

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_28710983/article/details/83064347
今日推荐