天天看點

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;

}