老大前几天提到libuv,我只看过一点libevent, 听说过libev,没听说过libuv,查了一下才知道libuv。
先到github git clone 源码,编译,测试,看测试代码
头文件uv.h定时器部分的函数,头文件有详细的注释
/* uv_timer_test.c */ #include <stdlib.h> #include <uv.h> #include <stdio.h> #include <assert.h> #include <time.h> static void timer_cb(uv_timer_t *handle, int status) { static int count; printf("count %d now %d\n", count++, time(NULL)); } int main(int argc, char *argv[]) { int r; uv_timer_t timer; r = uv_timer_init(uv_default_loop(), &timer); assert(r == 0); assert(!uv_is_active((uv_handle_t *) &timer)); assert(!uv_is_closing((uv_handle_t *) &timer)); printf("start %d\n", time(NULL)); r = uv_timer_start(&timer, timer_cb, atoi(argv[1]), 0); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); assert(r == 0); return 0; }
测试程序流程非常简单,
初始化定时器uv_timer_init
注册自己的定时回调函数uv_timer_start
运行 uv_run
编译:gcc -o test-uv-timer test_uv_timer.c -luv
注意在uv_timer_start函数的参数repeat设置为1的话,time_cb在第一次定时时间到后之后会一直回调
最后贴上修改的test-acitive.c代码,从这个测试代码和uv.h的函数注释基本可以学会使用定时器的使用。
#include <uv.h> #include <assert.h> #include <stdio.h> #include <stdlib.h> #define ASSERT assert static int close_cb_called = 0; static void close_cb(uv_handle_t* handle) { ASSERT(handle != NULL); close_cb_called++; } static void timer_cb(uv_timer_t* handle, int status) { ASSERT(0 && "timer_cb should not have been called"); } int main() { int r; uv_timer_t timer; r = uv_timer_init(uv_default_loop(), &timer); ASSERT(r == 0); ASSERT(!uv_is_active((uv_handle_t*) &timer)); ASSERT(!uv_is_closing((uv_handle_t*) &timer)); r = uv_timer_start(&timer, timer_cb, 1000, 0); ASSERT(r == 0); ASSERT(uv_is_active((uv_handle_t*) &timer)); ASSERT(!uv_is_closing((uv_handle_t*) &timer)); r = uv_timer_stop(&timer); ASSERT(r == 0); ASSERT(!uv_is_active((uv_handle_t*) &timer)); ASSERT(!uv_is_closing((uv_handle_t*) &timer)); r = uv_timer_start(&timer, timer_cb, 1000, 0); ASSERT(r == 0); ASSERT(uv_is_active((uv_handle_t*) &timer)); ASSERT(!uv_is_closing((uv_handle_t*) &timer)); uv_close((uv_handle_t*) &timer, close_cb); ASSERT(!uv_is_active((uv_handle_t*) &timer)); ASSERT(uv_is_closing((uv_handle_t*) &timer)); r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); ASSERT(r == 0); ASSERT(close_cb_called == 1); return 0; }
原文:http://blog.csdn.net/gamesofsailing/article/details/20143535