多事件类
在线程中经常要等待多个事件,每次创建很多事件很繁琐,所以写了这个类
你可以为按照事件序号为每个事件定义枚举,这样使用的时候很方便。这个代码能帮到你我很高兴,有什么问题请告诉我。
//////////////////////////////////H////////////////////////////////////////////////////////////
#ifndef LGLIB_MULTIEVENT_H
#define LGLIB_MULTIEVENT_H
namespace lglib
{
class __LGLIB__ lg_MultiEvent
{
public:
lg_MultiEvent(uint16 count);
virtual ~lg_MultiEvent();
public:
void resetall();
BOOL reset( uint16 npos);
void setall();
BOOL set( uint16 npos);
int32 wait( BOOL bWaitAll = FALSE );
int32 wait( uint32 timeout , BOOL bWaitAll = FALSE );
uint16 GetEventCount() const;
private:
uint16 m_EventCount;
HANDLE *m_hCond;
};
}
#endif
///////////////////////////////////CPP//////////////////////////////////////////////////////////
namespace lglib
{
lg_MultiEvent::lg_MultiEvent(uint16 count)
{
//////////////////////////////////////////////////////////////////////////
//MAXIMUM_WAIT_OBJECTS = 64
//WaitForMultipleObjects 最多能等待 64个事件,所以事件的定义不能超过64
//////////////////////////////////////////////////////////////////////////
m_EventCount = (count > 64 ) ? 64 : count;
m_hCond = new HANDLE[count];
for( uint16 i = 0; i < m_EventCount ; i++)
{
m_hCond[i] = CreateEvent(NULL,TRUE,FALSE,NULL);
}
}
lg_MultiEvent::~lg_MultiEvent()
{
for(uint16 i = 0;i < m_EventCount;i++)
{
CloseHandle(m_hCond[i]);
}
delete [] m_hCond;
}
void lg_MultiEvent::resetall()
{
for(int16 i = 0; i < m_EventCount; i++)
{
reset(i);
}
}
BOOL lg_MultiEvent::reset( uint16 npos )
{
if(npos >= m_EventCount)
return FALSE;
::ResetEvent( m_hCond[npos] );
return TRUE;
}
void lg_MultiEvent::setall()
{
for(uint16 i = 0;i < m_EventCount; i++)
{
set(i);
}
}
BOOL lg_MultiEvent::set( uint16 npos)
{
if(npos >= m_EventCount)
return FALSE;
::SetEvent( m_hCond[npos] );
return TRUE;
}
int32 lg_MultiEvent::wait( BOOL bWaitAll )
{
uint32 Ret = ::WaitForMultipleObjects(m_EventCount, m_hCond, bWaitAll,INFINITE );
if(Ret < (WAIT_OBJECT_0 + m_EventCount))
return (Ret - WAIT_OBJECT_0);
return -1;
}
int32 lg_MultiEvent::wait( uint32 timeout , BOOL bWaitAll)
{
uint32 Ret = WaitForMultipleObjects(m_EventCount, m_hCond, bWaitAll, timeout );
if(Ret < (WAIT_OBJECT_0 + m_EventCount))
return (Ret - WAIT_OBJECT_0);
return -1;
}
uint16 lg_MultiEvent::GetEventCount() const
{
return m_EventCount;
}
}