1. 程式人生 > >libuv實現timer時鐘庫

libuv實現timer時鐘庫

 

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