CMCore/inc/hgl/thread/ASyncEvent.h

124 lines
3.0 KiB
C
Raw Normal View History

2019-08-19 19:19:58 +08:00
#ifndef HGL_THREAD_ASYNC_EVENT_INCLUDE
#define HGL_THREAD_ASYNC_EVENT_INCLUDE
#include<hgl/thread/SwapData.h>
#include<hgl/type/Queue.h>
#include<hgl/thread/Thread.h>
#include<hgl/Time.h>
namespace hgl
{
namespace async
{
/**
*
*/
class EventProc
{
public:
EventProc()=default;
virtual ~EventProc()=default;
virtual bool Proc(const double &cur_time)=0;
};//class EventProc
using EventProcQueue=Queue<EventProc *>;
using MTEventProcQueue=SemSwapData<EventProcQueue>;
using MTEventProcPost=PostToSemSwapData<EventProcQueue>; ///<多线程事件结果投递对象重定义
/**
*
* @param queue
* @param event
*/
inline void AddToEventQueue(MTEventProcQueue *queue,EventProc *event)
{
if(!queue||!event)
return;
MTEventProcPost post(queue);
post->Push(event);
}
/**
*
* @param proc_queue
* @param cur_time
* @param wait
*/
inline void UpdateEventProcQueue(MTEventProcQueue *proc_queue,const double &cur_time,bool wait=false)
{
if(!proc_queue)
return;
if(wait)
{
if(!proc_queue->WaitSemSwap())
return;
}
else
{
if(!proc_queue->TrySemSwap())
return;
}
EventProcQueue &epq=proc_queue->GetReceive();
if(epq.GetCount()<=0)
return;
EventProc *event;
while(epq.Pop(event))
{
event->Proc(cur_time);
delete event;
}
}
/**
* 线
*/
class EventThread:public Thread
{
MTEventProcQueue *event_proc_queue;
public:
EventThread(MTEventProcQueue *queue):event_proc_queue(queue){}
virtual ~EventThread()=default;
bool Execute() override
{
if(!event_proc_queue)
return(false);
UpdateEventProcQueue(event_proc_queue,GetDoubleTime(),true);
return(true);
}
};//class EventThread:public Thread
/**
* 使
*/
/*
// 公用部分
MTEventProcQueue event_queue; ///<事件队列
// 其它 thread
class MyEvent:public EventProc{...}; //自有事件
AddToEventQueue(&event_queue,new MyEvent); //添加一个事件到事件队列
// 事件执行线程
EventThread *et=new EventThread(&event_queue);
et->Start();*/
}//namespace async
}//namespace hgl
#endif//HGL_THREAD_ASYNC_EVENT_INCLUDE