龙仪的家

导航

<2008年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

随笔分类

文章分类

收藏夹

随笔档案

文章档案

统计

我的常用网址

代码库之四-多事件

多事件类
在线程中经常要等待多个事件,每次创建很多事件很繁琐,所以写了这个类
你可以为按照事件序号为每个事件定义枚举,这样使用的时候很方便。这个代码能帮到你我很高兴,有什么问题请告诉我。
//////////////////////////////////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;
 }
}

posted on 2006-04-29 10:03 longest 阅读(516) 评论(0)  编辑 收藏

评论

标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]