libuv timer的封装与使用

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

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

//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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值