OMNeT++学习程序6

构建处理延时:在以前的实验中都是,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);
        }
    }
}

 

 

转载于:https://www.cnblogs.com/xunmeng/archive/2012/10/11/2719934.html

你可能感兴趣的:(OMNeT++学习程序6)