zoukankan      html  css  js  c++  java
  • 浅析NS2中的定时器(Timer)(转)

    首先需要知道的是定时器(Timer)既可以在C++中实现也可以在Otcl中实现。在C++中,各种定时器都是基于抽象基类TimerHandler 的,而其又是由Handler继承来的,而且定时器经常用于Agent对象中,当然也可以用在其他对象中,这里主要说在Agent对象中的使用方法。

           列举几个比较重要的函数和参数:
           sched():设定定时器在delay秒后超时,此时定时器必须处在TIMER_IDLE状态。
           resched():重新设定定时器的超时时间,在调用resched(()函数时,定时器可以处于TIMER_PENDING状态。
           cancel():取消定时器,调用cancel()函数时定时器必须处于TIMER_PENDING状态。
           status():返回定时器的当前状态,状态值可能是TIMER_IDLE,TIMER_PENDING,TIMER_HANDLE.
                        TIMER_IDLE:是对象刚刚被初始化或者被取消之后的状态。
                        TIMER_PENDING:是当调度一个时间之后处于的状态。
                        TIMER_HANDLE:是当定时器时间到转而去执行一个特定任务时的状态。
           expire():是纯虚函数,必须由派生类给出,即用户自行定义实现其功能。
           handle():处理一个事件,当定时器超时后,Scheduler对象会调用定时器的handle()函数,并把event_()作为参数,此时定时 器的状态不能为TIMER_PENDING.handle()函数会调用expire()函数,并设定定时器的status_。
           int status_:保存当前定时器的状态。
           Event event:当定时器超时后需要处理的事件。
           下面举个简单的例子:
           class Rumorrouting_BroadTimer : public TimerHandler {
           public:
                  Rumorrouting_BroadTimer(Rumorrouting* agent) : TimerHandler() {
                         agent_ = agent;
                  }
           protected:
                  Rumorrouting* agent_;
                  virtual void expire(Event* e);
           };
           下面是Rumorrouting类的定义:
           class Rumorrouting : public Agent {
                  friend class Rumorrouting_BroadTimer;
                  ……
                  Rumorrouting_BroadTimer broad_timer_;
                  ……
                  void reset_rumorrouting_broad_timer();
                  ……
           }
           再看Rumorrouting的构造函数:
           Rumorrouting::Rumorrouting(nsaddr_t id) : Agent(PT_RUMORROUTING), broad_timer_(this), ……
           {
                  ……
           }
           我们发现对定时器对象broad_timer_的初始化是用this指针,而从最上面定时器类的定义中我们发现this指针赋值给了agent_变量。
           接着看:
           void Rumorrouting_BroadTimer::expire(Event* e) {
                  agent_->send_broad_pkt();
                  agent_->reset_rumorrouting_broad_timer();
           }
           我们发现当超时以后会重传,然后再调用Rumorrouting的reset_rumorrouting_broad_timer()函数。
           我们再来看一下Rumorrouting的reset_rumorrouting_broad_timer()函数:
           Rumorrouting::reset_rumorrouting_broad_timer() {
                  if(broadTimes<BROAD_HELLO_MAX)
                  {
                         broad_timer_.resched((double)0.5);
                         broadTimes++;
                  }
                  else
                         broad_timer_.resched((double)600000.0);
           }
            这里便用到了broad_timer_定时器对象,并且利用resched()函数重新设定了超时时间。
           OK了,对TimerHandler的使用应该比较清晰了~
  • 相关阅读:
    SQL语句中的GO
    别人如何使用JsUnit的
    类,子类,继承,virtual, abstract, override
    尝到JsUnit自动测试的甜头
    A class file was not written. The project may be inconsistent, if so try refreshing this project and building it. eclipse提示错误
    正则表达式收集
    jquery 无限级下拉菜单
    javascript学习笔记,绝对值,倒计时,按数字计算
    java 常识
    jquery ajax 从后台获取数据时 firefox控制台显示未组织好错误
  • 原文地址:https://www.cnblogs.com/zhangleiccst/p/2175124.html
Copyright © 2011-2022 走看看