天天看点

libuv timer的封装与使用

libuv timer的封装与使用

一、libuv编译环境

 1.可查看上一篇“libuv 介绍与编译”-  http://mp.blog.csdn.net/postedit/79193274

二、项目筛选器结构

libuv timer的封装与使用

程序代码

//time_list.h #ifndef _TIME_LIST_H_

#define _TIME_LIST_H_

#endif

struct timer;

//onTime:一个回调函数,当timer触发时调用;

//uData:用户传入自定义的数据结构;

//after_s:多少秒开始执行;

//repeat:执行多少次;

struct timer* schedule(void(*onTime)(void* uData), void* uData, int after_s, int repeat_count);

void cancel_time(struct timer* t);

//time_list.c #include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include "uv.h"

#include "time_list.h"

struct timer

{

 uv_timer_t uv_timer;

 void(*onTime)(void* uData);

 void* uData;

 int repeatCount; // 小于 0 则一直循环;

};

static struct timer* alloc_timer(void(*onTime)(void* uData), void* uData, int repeat_count)

{

 struct timer* t = malloc(sizeof(struct timer));

 memset(t, 0, sizeof(struct timer));

 t->onTime = onTime;

 t->uData = uData;

 t->repeatCount = repeat_count;

 uv_timer_init(uv_default_loop(), &(t->uv_timer));

 return t;

}

static void free_timer(struct timer* t)

{

 free(t);

}

static void on_uv_time(uv_timer_t* handle)

{

 struct timer* t = handle->data;

 if (t->repeatCount < 0)//不断触发;

 {

   t->onTime(t->uData);

 }

 else

 {

   t->repeatCount--;

   t->onTime(t->uData);

   if (t->repeatCount == 0)//函数time结束;

   {

     //停止并释放timer;

     uv_timer_stop(&t->uv_timer);

     free_timer(t);

   }

 }

}

struct timer* schedule(void(*onTime)(void* uData), void* uData, int after_s, int repeat_count)

{

 struct timer* t = alloc_timer(onTime, uData, repeat_count);

 t->uv_timer.data = t;

 //启动timer;

 uv_timer_start(&(t->uv_timer), on_uv_time, after_s * 1000, after_s * 1000);

}

void cancel_time(struct timer* t)

{

 //主动取消时,判断执行数是否为0,如果为0,则表示timer已经被释放了,直接返回即可;

 if (t->repeatCount == 0)

 {

   return;

 }

 uv_timer_stop(&t->uv_timer);

 free_timer(t);

}

//main_time.c #include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include "uv.h"

#include "time_list.h"

static uv_loop_t* event_loop = NULL;

static uv_timer_t timer;

static void onTimeCallback(uv_timer_t* handle)

{

 printf("timer called\n");

}

int main(int argc, char** argv)

{

 event_loop = uv_default_loop();

 //每隔1秒调1次,一共触发5次 //如果最后一个参数为负数,则一直触发

 struct timer* t = schedule(onTimeCallback, "HelloWorld", 1, 5);

 uv_run(event_loop,UV_RUN_DEFAULT);

 system("pause");

 return 0;

}