【以後再也不會用了】Libuv異步定時事務

前言:

  應項目需求在設備接口中封裝了異步事件處理,考慮到跨平臺性選用了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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章