前言:
应项目需求在设备接口中封装了异步事件处理,考虑到跨平台性选用了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;
}