libuv_定時器設計

來源:互聯網
上載者:User
事件迴圈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 intget_cur_ms() {    return GetTickCount();}#else#include <sys/time.h>  #include <time.h> #include <limits.h>static unsigned intget_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 freestruct 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 voidfree_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;}voidcancel_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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.