ns2中定时器的使用详解
2014-08-19 16:56
260 查看
路由协议中定时器使用广泛,它可以用来每隔固定时间重复一件事情。
一个定时器通常有如下的结构:
1、声明:
在将要使用到定时器的类里面,将定时器声明为friend,同时声明出一个定时器对象。
class MAAODV: public Agent {
……
friend class maAntTimer;
……
……
maAntTimer atimer;
……
};
2、定义,重载:
class maAntTimer : public TimerHandler {
public:
maAntTimer(MAAODV* a) : TimerHandler() {
agent = a;
}
protected:
MAAODV *agent;
virtual void expire(Event* e);
};
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里面的时间可以用表达式代替,哈哈,这样就可以按某个特定的方式来执行你的事情了,例如第1、3、5、7或者1、4、9、16之类…………
4、开启定时器:
上面的定时器还不能工作,为什么?因为它自己也不知道自己什么时间应该开始工作,那就让我们帮它一把,在command函数里,加上这样的代码
MAAODV::command(int argc, const char*const* argv) {
……
……
if(strncasecmp(argv[1], "start", 2) == 0) {
……
……
atimer.sched((double)0.0);
……
……
}
……
……
}
OK!大功告成,赶紧去試一下吧!
哈哈,发现问题了吗?我们期望的是在模拟刚开始时就执行expire里面的内容一次,这就是atimer.sched((double)0.0)的目的,但是好像没有达到预期的效果,第一次没有执行,而是从第2次开始,往下每隔一定时间执行一次,都很正常,为什么?
问题就出在atimer.sched((double)0.0)上,因为模拟一开始,时间就从0开始增加,执行该代码时间必定大于0,所以第一次必定是在经过ANT_INTERVAL时间之后。
解决方法:atimer.sched((double)0.01)
一个定时器通常有如下的结构:
1、声明:
在将要使用到定时器的类里面,将定时器声明为friend,同时声明出一个定时器对象。
class MAAODV: public Agent {
……
friend class maAntTimer;
……
……
maAntTimer atimer;
……
};
2、定义,重载:
class maAntTimer : public TimerHandler {
public:
maAntTimer(MAAODV* a) : TimerHandler() {
agent = a;
}
protected:
MAAODV *agent;
virtual void expire(Event* e);
};
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里面的时间可以用表达式代替,哈哈,这样就可以按某个特定的方式来执行你的事情了,例如第1、3、5、7或者1、4、9、16之类…………
4、开启定时器:
上面的定时器还不能工作,为什么?因为它自己也不知道自己什么时间应该开始工作,那就让我们帮它一把,在command函数里,加上这样的代码
MAAODV::command(int argc, const char*const* argv) {
……
……
if(strncasecmp(argv[1], "start", 2) == 0) {
……
……
atimer.sched((double)0.0);
……
……
}
……
……
}
OK!大功告成,赶紧去試一下吧!
哈哈,发现问题了吗?我们期望的是在模拟刚开始时就执行expire里面的内容一次,这就是atimer.sched((double)0.0)的目的,但是好像没有达到预期的效果,第一次没有执行,而是从第2次开始,往下每隔一定时间执行一次,都很正常,为什么?
问题就出在atimer.sched((double)0.0)上,因为模拟一开始,时间就从0开始增加,执行该代码时间必定大于0,所以第一次必定是在经过ANT_INTERVAL时间之后。
解决方法:atimer.sched((double)0.01)
相关文章推荐
- ns2中定时器的使用详解
- windows定时器详解,如何使用windows定时器
- spring定时器的使用详解
- jQuery扇形定时器插件pietimer使用方法详解
- linux使用select实现定时器详解
- Linux应用层的定时器Timer使用详解【转】
- java多线程之定时器Timer的使用详解
- 【转】ns2中定时器的使用
- iOS定时器NSTimer使用详解
- linux使用select实现精确定时器详解
- jdk自带定时器使用方法详解
- iOS 定时器使用详解
- 定时器使用(for NS2)
- Linux应用层的定时器Timer使用详解
- 使用Stm32Cubemx配置定时器正交编码模式详解(附上程序思想介绍)
- NS2 传输距离修改工具threshold使用详解
- Dotnet定时器使用实例详解
- linux使用select实现精确定时器详解
- Linux应用层的定时器Timer使用详解
- linux使用select实现精确定时器详解