前言:
應項目需求在設備接口中封裝了異步事件處理,考慮到跨平臺性選用了libuv工具包,接口需求是異步定時處理一些邏輯運算,結果在對着API使用的過程中發現,libuv在很多回調函數封裝中,沒有封裝傳參!大概以後再也不會用了!
異步定時事務代碼:
#include <stdlib.h>
#include <uv.h>
#include <stdio.h>
static void QCard_Event_ChargingForCon_Loop(uv_timer_t *handle)
{
printf("hello world1\n");
Sleep(2000);
printf("hello world2\n");
}
static void QCard_Event_ChargingForCon_Run(void* arg)
{
QCard_Event *phevent = (QCard_Event *)arg;
uv_loop_init(&(phevent->event_loop));
uv_timer_init(&(phevent->event_loop), &(phevent->timer));
uv_timer_start(&(phevent->timer), QCard_Event_ChargingForCon_Loop, 0, 1000); // 立即執行、每隔1s循環一次
uv_run(&(phevent->event_loop), UV_RUN_DEFAULT);
printf("uv_run break\n");
}
int QCard_Event_ChargingForCon(QCard_Event **phEventHandle)
{
QCard_Event *phevent = 0;
unsigned char SystemId[64] = {0};
int ret = 0, i = 0;
phevent = (QCard_Event *)malloc(sizeof(QCard_Event));
memset(phevent, 0, sizeof(QCard_Event));
ret = uv_thread_create(&(phevent->threads), QCard_Event_ChargingForCon_Run, phevent); //啓動事務
if(ret)
{
free(phevent);
}
else
{
*phEventHandle = phevent;
}
return ret;
}
int QCard_StopEvent_ChargingForCon(QCard_Event *phEventHandle)
{
QCard_Event *phevent = (QCard_Event *)phEventHandle;
int ret = 0;
ret= uv_timer_stop(&(phevent->timer));
if(ret)
{
printf("%s\n", uv_strerror(ret));
}
uv_close(&(phevent->timer), NULL);
uv_stop(&(phevent->event_loop));
ret= uv_thread_join(&(phevent->threads));
if(ret)
{
printf("%s\n", uv_strerror(ret));
}
//TODO 異常返回
ret = uv_loop_close(&(phevent->event_loop));
if(ret)
{
printf("%s\n", uv_strerror(ret));
}
free(phevent);
return ret;
}