OMNet++ 学习小结(二)

OMNet使用消息表示事件的发生,每个事件有cMessage类或者他的子类的一个实例表示,OMNet中没有独立的事件类。消息被从一个模块发生到另外一个模块,意味着“事件发生的地方”就是消息的目的模块,事件发生时的模拟时间就是消息的到达时间

在OMnet中,事件就在简单模块内部发生,也就是说简单模块实现模型的具体行为。用户从cSimpleModule类派生子类来创建简单模块,cSimpleModule类是OMNet类库中的一个类。

一、简单模块的C++实现包括:

1、模块类的声明(派生于cSimpleModule类)

2、模块类型的注册(Define_Module())

3、模块类的实现

模块类的声明和注册语法如下:

class 模块名:public cSimpleModule{                          //1

类成员...

};

Define_Module(模块名);                                         //2

二、handleMessage()和activity()

handleMessage()是cSimpleModule的虚拟成员函数,缺省情况下它声明都不做,所以用户必须在自己的模块类下面中添加消息处理代码,改写该函数。

使用handleMessage()的模块不会自动激活,仿真核仅仅为activity()产生激活消息,也就是说,如果用户希望模块自己开始工作,二不是依靠接受其他模块的消息来启动,就必须在initialize()函数中调度自消息(也就是模块内部的事件消息,或者是初始消息),利用initialize()函数中的初始消息来激活对handleMessage()的调用,当然,如果模块仅仅是对来自其他模块的消息做出反应,就不用初始消息。

handleMessage()相比activity()而言,有几大优点:

1、消耗内存小

2、对于状态转换很少或者没有状态转换的模块,用handleMessage()更方便

3、对于状态很多而且是随机的状态转换模块,用handleMessage()比较容易实现

三、initialize()和finish()

首先,所有模块都有initialize()函数,用于模块的初始化,复合模块的Initialize()在其子模块的initialize()被调用之前调用

finish()则主要是仿真结束时记录统计数据,而且只有模块正常结束时菜调用,复合模块与其子模块的finish()调用顺序刚好与initialize()相反。

四、关于消息

自定义消息

自定义消息允许我们根据自己的需要设定具体的消息结构

例如:建立一个MyPacket.msg消息如下

message MyPacket

{

fields:

int srcAddress;

int destAddress;

int hops = 32;

};

使用消息子类编译器处理(dos下进入.msg所在文件夹,命令:opp_msgc + 文件名 即可编译)后可以生成两个文件

1、mypacket_m.h

2、Mypacke_m.cc

3、mypacket_m.h主要包括了mypacket类的声明,而此类中的成员函数等的实现则放在了mypacke_m.cc文件中

可以用opp_nmakemake命令来进行编译和链接

 

发布了24 篇原创文章 · 获赞 3 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/saeba5566/article/details/6203518