浅析NS2中的定时器(Timer)
2011-04-17 21:56
211 查看
http://myjfm.blog.163.com/blog/static/13235748420100299924652/
首先需要知道的是定时器(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的使用应该比较清晰了~
首先需要知道的是定时器(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的使用应该比较清晰了~
相关文章推荐
- 浅析NS2中的定时器(Timer)
- 浅析NS2中的定时器(Timer)(转)
- NS2 定时器:BackoffTimer/ DeferTimer/NavTimer/RxTimer/TxTimer/IFTimer
- erlang的timer定时器浅析
- Python 定时器 timer
- 02_张孝祥_Java多线程_传统定时器Timer
- Android:用定时器刷 timer 新界面
- 定时器Timer的参数
- 【boost学习】之boost::asio(1)——Timer定时器
- linux下定时器的使用--timer_create等系列
- JAVA定时器实现之一(通过继承TimerTask)
- JAVA TIMER定时器
- 内核定时器timer_list使用
- Nios II 定时器内核之sys_clk_timer
- windows服务中的定时器timer的使用
- Timer和spring的Quartz两种定时器的区别。
- 定时器应用:Timer和TimerTask类
- [ Javascript ] JavaScript中的定时器(Timer) 是如何工作的!
- 第十三章 ZYNQ-MIZ701 TIMER定时器中断
- STM32f103的数电采集电路的TIMER定时器的使用与时序控制的程序