• 【转】ns2中定时器的使用


    定时器可以用来每隔固定时间重复一件事情。

    一个定时器通常有如下的结构:

    1、声明:

    在将要使用到定时器的类里面,将定时器声明为friend,同时声明出一个定时器对象。

    class MAAODV: public Agent {

        ……

        friend class maAntTimer;   // 如果所访问的成员为public,则不用声明

        ……

        ……

        maAntTimer      atimer;

        ……

    };

    2、定义,重载:

    class maAntTimer : public TimerHandler {

    public:

            maAntTimer(MAAODV* a) : TimerHandler() {

            agent = a;

        }

    protected:

            MAAODV    *agent;

        virtual void expire(Event* e);

    };

    分析tcp中的代码:

    定义一个定时器(tcp.h)
    class RtxTimer : public TimerHandler {
    public:
    RtxTimer(TcpAgent *a) : TimerHandler() { a_ = a; }
    protected:
    virtual void expire(Event *e);
    TcpAgent *a_;
    };


    3、书写expire代码,做你想做的事

    void

    maAntTimer::expire(Event* e) {

        if(agent->AntReceived == false) {

            agent->genAnt();

        }

        else {

            agent->AntReceived = false;

        }

        agent->atimer.resched((double)ANT_INTERVAL);

    }

    如果只想要定时器运行一次,则去掉最后一行代码。加上最后一行,定时器会在规定时间后重新shedule一次,将自己再次加入调度器中,这样,每隔固定时间就会执行一次expire里的代码了。

    resched里面的时间可以用表达式代替,这样就可以按某个特定的方式来执行你的事情了。

    handle()函数在定时器超时后调用expire函数处理一个事件。

    tcp.cc中定义expire
    void RtxTimer::expire(Event*)
    {
    a_->timeout(TCP_TIMER_RTX);
    }

    4、开启定时器:

    上面的定时器还不能工作,因为它自己也不知道自己什么时间应该开始工作,在command函数里,加上这样的代码

    MAAODV::command(int argc, const char*const* argv) {

        ……

        ……

        if(strncasecmp(argv[1], "start", 2) == 0) {

            ……

            ……

            atimer.sched((double)0.0);

            ……

            ……

         }         

        ……

        ……

    }

    我们期望的是在模拟刚开始时就执行expire里面的内容一次,这就是atimer.sched((double)0.0)的目的,但是好像没有达到预期的效果,第一次没有执行,而是从第2次开始,往下每隔一定时间执行一次,都很正常,为什么?

    问题就出在atimer.sched((double)0.0)上,因为模拟一开始,时间就从0开始增加,执行该代码时间必定大于0,所以第一次必定是在经过ANT_INTERVAL时间之后。

    解决方法:atimer.sched((double)0.01)

  • 相关阅读:
    第九次任务
    第八次任务
    第七次任务
    第六次任务
    第四天半任务
    第四天任务
    第三天任务
    第二天任务
    第一天任务
    第⑩天任务
  • 原文地址:https://www.cnblogs.com/zhangleiccst/p/2181286.html
Copyright © 2020-2023  润新知