libuv_定时器设计

事件循环Loop

这里写图片描述


libuv 高精度timer

这里写图片描述
1: 创建一个timer 请求:
uv_timer_init(uv_default_loop(), &timer_handle);
2: 添加一个定时器:
uv_timer_start(&timer_handle, timer_callback, msec, 1);
3: 取消一个定时器:
uv_timer_stop();

这里写图片描述

这里写图片描述


获取系统运行时间

#ifdef WIN32
#include <windows.h>
static unsigned int
get_cur_ms() {
    return GetTickCount();
}
#else
#include <sys/time.h>  
#include <time.h> 
#include <limits.h>

static unsigned int
get_cur_ms() {
    struct timeval tv;
    // struct timezone tz;
    gettimeofday(&tv, NULL);

    return ((tv.tv_usec / 1000) + tv.tv_sec * 1000);
}
#endif 

这里写图片描述


设计timer系统

1:unsigned int schedule(void(*on_timer)(void* udata), void* udata, float after_sec, int repeat);
2:void cancel_timer(unsigned int timeid) ;
3:unsigned int schedule_once(void(*on_timer)(void* udata), void* udata, float after_sec);

创建头文件与库
这里写图片描述

头文件
这里写图片描述

接口库文件

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "uv.h"
#include "timer_list.h"

#define my_malloc malloc
#define my_free free

struct timer{
    uv_timer_t uv_timer;//libuv timer handle
    void(*on_timer)(void* udata);
    void* udata;
    int repeat_count; //-1 是一直循环;
};

static struct timer* 
alloc_timer(void(*on_timer)(void* udata),
            void* udata, int repeat_count){
    struct timer* t = my_malloc(sizeof(struct timer));
    memset(t, 0, sizeof(struct timer));
    t->on_timer = on_timer;
    t->repeat_count = repeat_count;
    t->udata = udata;
    uv_timer_init(uv_default_loop(),&t->uv_timer);
    return t;
}

static void
free_timer(struct timer* t){
    my_free(t);
}

static void on_uv_timer(uv_timer_t* handle){
    struct timer* t = 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);
        }
    }

}

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

    //启动一个timer;
    t->uv_timer.data = t;
    uv_timer_start(&t->uv_timer, on_uv_timer, after_msec, after_msec);
    return t;
}


void
cancel_timer(struct timer* t){
    if (t->repeat_count == 0){  //全部触发完成
        return;
    }
    uv_timer_stop(&t->uv_timer);
    free_timer(t);
}


struct timer*
schedule_once(void(*on_timer)(void* udata),
              void* udata,
              int after_msec){
    return schedule(on_timer,udata,after_msec,1);
}

这里写图片描述

这里写图片描述


调试Debug

隔5秒就调用,调用5次
这里写图片描述

每隔1秒就调用
这里写图片描述

自定义调用次数,后释放内存

这里写图片描述

调用中,插入一次
这里写图片描述


Code

猜你喜欢

转载自blog.csdn.net/qq_36482772/article/details/79977874