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