C++ Socket library中两个关键接口类[1]IEventHandler

2013年6月24日 由 Creater 留言 »

IEventHandler主要是针对于Timer Event,所以几个纯虚函数都是与之相关的。

virtual bool GetTimeUntilNextEvent(struct timeval *) = 0;

该接口用于获取下一次Timer Event触发的时间,结果由值-结果参数timeval传回。这个结构体的定义可以查看struct timeval结构体 以及 gettimeofday()函数
如果有下一个Timer Event则返回true,否则返回false。可以来看看IEventHandler的派生类EventHandler是怎么实现该接口的。

bool EventHandler::GetTimeUntilNextEvent(struct timeval *tv)
{
	//如果事件链表为空,表明没有下一个可用的timer Event
	if (!m_events.size())
		return false;
	std::list::iterator it = m_events.begin();
	if (it != m_events.end())
	{
		//获取现在时刻
		EventTime now;
		//和链表中的时刻进行比较
		mytime_t diff = (*it) -> GetTime() - now;
		if (diff < 1) 		{ 			diff = 1; 		} 		//对这个时间间隔进行返回 		tv -> tv_sec = static_cast(diff / 1000000);//秒
		tv -> tv_usec = static_cast(diff % 1000000);//微妙零头
		return true;
	}
	return false;
}

virtual void CheckEvents() = 0;

该函数在EventHandler实现为检查timer Event是否时间已到,时间到达则驱动OnEvent回调函数。

void EventHandler::CheckEvents()
{
	EventTime now;
	std::list::iterator it = m_events.begin();
	//list中还有timer event,而且他们的时间已经小于当前的时间,则表示这些事件应该触发了
	while (it != m_events.end() && (*it) -> GetTime() < now)
	{
		Event *e = *it;
		Socket *s = dynamic_cast(e -> GetFrom());
		/*
		s == NULL    This is another object implementing 'IEventOwner' and not a socket.
		s != NULL    This is a Socket implementing IEventOwner, and we can check that the
			     object instance still is valid using SocketHandler::Valid.
		*/
		//如果继承IEventOwner的为一个套接字类则s!=NULL;否则为NULL
		if (!s || (s && Valid( e -> Data() )))
		{
			e -> GetFrom() -> OnEvent(e -> GetID());
		}
		//从list查找timer event事件e
		for (it = m_events.begin(); it != m_events.end(); ++it)
			if (*it == e)
			{
				delete e;
				break;
			}
		//如果查找到则删除
		if (it != m_events.end())
			m_events.erase(it);
		//从新从头开始
		it = m_events.begin();
	}
}
virtual long AddEvent(IEventOwner *,long sec,long usec) = 0;

给事件拥有者IEventOwner 增加一个Timer Event。该函数在EventHandler为:

long EventHandler::AddEvent(IEventOwner *from,long sec,long usec)
{
	Socket *s = dynamic_cast(from);
	Event *e = new Event(from, sec, usec, s ? s -> UniqueIdentifier() : 0);
	std::list::iterator it = m_events.begin();
	//按照时间顺序来插入
	while (it != m_events.end() && *(*it) < *e) 	{ 		++it; 	} 	m_events.insert(it, e); 	Release();  	//返回timer event的ID 	return e -> GetID();
}
virtual void ClearEvents(IEventOwner *) = 0;

该接口则是从管理器中删除拥有者为IEventOwner 的timerEvent。

广告位

发表评论

你必须 登陆 方可发表评论.