• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    5年前 (2013-06-24)  Socket library |   17 条评论  16 
    文章评分 0 次,平均分 0.0

    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。

     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/1580.html

    关于

    发表评论

    暂无评论

    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享