libuv timer的封装与使用
一、libuv编译环境
1.可查看上一篇“libuv 介绍与编译”- http://mp.blog.csdn.net/postedit/79193274
二、项目筛选器结构
程序代码
//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);
#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;
/*
参数说明;
1.timer句柄;
2.onTimeCallback回调函数;
3.第一次间隔多长时间触发;
4.第一次后每隔多长时间触发;
*/
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);
}
#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;
/*
参数说明;
1.timer句柄;
2.onTimeCallback回调函数;
3.第一次间隔多长时间触发;
4.第一次后每隔多长时间触发;
*/
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;
}
#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;
}