构建处理延时:在以前的实验中都是,tic和toc模块都是在接收到消息后立即传送消息,这里讲添加计时器。tic和toc都会在接收到消息后保存一个仿真时间,然后再发送消息。在OMNeT++中这样的延时是通过自消息实现的。需要修改初始化函数和事件处理函数,初始化函数应该注意消息空间的申请,事件处理函数中处理的是两种消息,不再是一个消息来回发送,所以通信用的消息存在属于谁的问题,每次接收到tictocMsg类型消息都需要保存,以备接收到event消息时候发送。
1.demo.h添加两个消息私有成员变量event和tictocMsg:event用于存储自消息,tictocMsg用于存储通信消息
#ifndef TXC1_H_
#define TXC1_H_
#include
#include
class Txc1 : public cSimpleModule
{
private:
int counter;
cMessage *event;//在计时时候用的事件指针
cMessage *tictocMsg;
protected:
virtual void initialize();
virtual void handleMessage(cMessage *msg);
};
#endif /* TXC1_H_ */
2.修改demo.cc文件:
程序这样写是不对的,会出现消息指针tictocMsg是空的情况,这是因为只在tic中对该消息进行了new,在toc向tic发送消息的时候就会发现它发送的消息指针式空的。以前的程序可以只在tic中对消息new是因为消息是来回发送的,发送到目的端就属于目的端了。
#include "Txc1.h"
Define_Module(Txc1);
//启动tic-toc-tic-toc过程,一个模块需要发送第一个消息,让我们设定为是tic发送第一个消息
void Txc1::initialize()
{
counter=par("limit");
//添加WATCH可以在运行的时候,右键单击模块,选择Inspect as object,查看counter的变化。
WATCH(counter);
//判断是Tic还是Toc
event=new cMessage("event");
if(strcmp("tic",getName())==0)
{
tictocMsg=new cMessage("tictocMsg");//为参数赋值
scheduleAt(simTime()+1.0,event);//当前时间加上1个仿真时间,发送event自消息
}
}
//这个函数每当消息到来的时候调用,这里我们只是将这个消息发送给其它模块(通过out门),因为tic和toc做的是相同的事情,所以消息会在两个模块间回荡
void Txc1::handleMessage(cMessage *msg)
{
counter--;
if(counter>=0)
{
if(msg==event)
{
EV<<"Received event message,send tictocMsg\n";
send(tictocMsg,"out");
}
else
{
EV<<"Received tictocMsg message,delay\n";
scheduleAt(simTime()+1.0,event);
}
}
}
改正方法是把红色语句拿到if语句之前,但是这样也是会在发送两轮消息以后发生问题,原因是消息发送给对方,就属于对方,不属于自己,所以每次发送都需要复制消息,发送消息副本,但是这样就会产生很多消息。
解决方法是,当接收到tictocMsg(即else),将接收到的消息保存tictocMsg中:tictocMsg=msg,这样tictocMsg就不再是空或者消息不属于自己了。代码如下:
#include "Txc1.h"
Define_Module(Txc1);
//启动tic-toc-tic-toc过程,一个模块需要发送第一个消息,让我们设定为是tic发送第一个消息
void Txc1::initialize()
{
counter=par("limit");
//添加WATCH可以在运行的时候,右键单击模块,选择Inspect as object,查看counter的变化。
WATCH(counter);
//判断是Tic还是Toc
event=new cMessage("event");//这个消息可以只定义一次,因为是自消息,所以用于都自己
if(strcmp("tic",getName())==0)
{
tictocMsg=new cMessage("tictocMsg");//tictocMsg就申请这么一个空间
scheduleAt(simTime()+1.0,event);//当前时间加上1个仿真时间,发送event自消息
}
}
//这个函数每当消息到来的时候调用,这里我们只是将这个消息发送给其它模块(通过out门),因为tic和toc做的是相同的事情,所以消息会在两个模块间回荡
void Txc1::handleMessage(cMessage *msg)
{
counter--;
if(counter>=0)
{
if(msg==event)//这里的event是指针
{
EV<<"Received event message,send tictocMsg\n";
send(tictocMsg,"out");
}
else
{
EV<<"Received tictocMsg message,delay\n";
tictocMsg=msg;//用tictocMsg保存接收到的消息,这样这个消息始终不空而且属于自己,再接到event消息时可以直接发送出去。
scheduleAt(simTime()+1.0,event);
}
}
}