OMNeT++仿真的起点及终点函数是什么?如何添加对应日志?
OMNeT++ 仿真启动入口与结束回调使用说明
核心可自定义钩子说明
- 仿真启动钩子(两类常用实现):
- 应用层级:顶层网络模块(即ini文件中
network参数指定的根模块)的initialize()(多阶段初始化的最后阶段),所有子模块初始化完成、仿真事件循环启动前执行,无需修改仿真内核即可实现,适配单项目需求 - 内核层级:自定义
cSimulation子类的setup()函数,仿真内核初始化完成后执行,可实现全项目通用的启动逻辑
- 应用层级:顶层网络模块(即ini文件中
- 仿真结束钩子(两类常用实现):
- 应用层级:顶层网络模块的
finish()函数,所有仿真事件处理完成、结果统计输出前执行 - 内核层级:自定义
cSimulation子类的shutdown()函数,仿真所有收尾工作完成、内核退出前执行
- 应用层级:顶层网络模块的
单项目快速实现方案(推荐,无需修改内核)
1. 修改顶层网络类头文件
在你的顶层网络类定义中添加两个方法的重写声明,示例如下:
#include <omnetpp.h> using namespace omnetpp; class YourTopNetwork : public cModule { protected: // 多阶段初始化需要额外重写numInitStages,单阶段初始化可直接声明void initialize() override virtual int numInitStages() const override; virtual void initialize(int stage) override; virtual void finish() override; };
2. 添加启动日志代码
在.cc实现文件中编写initialize逻辑,确保启动日志在所有模块初始化完成后输出:
int YourTopNetwork::numInitStages() const override { // 返回值需要大于所有子模块的初始化阶段数,保证当前阶段是最后执行的 return 2; } void YourTopNetwork::initialize(int stage) { cModule::initialize(stage); if (stage == 1) { // 最后一个初始化阶段 EV << "The simulation is started"; } }
如果使用单阶段初始化,简化为:
void YourTopNetwork::initialize() { // 原有初始化逻辑 EV << "The simulation is started"; }
3. 添加结束日志代码
在.cc实现文件中编写finish逻辑:
void YourTopNetwork::finish() { cModule::finish(); // 原有结果统计逻辑 EV << "The simulation is finished"; }
全场景通用实现方案(适用于多个仿真项目复用逻辑)
如果需要所有加载的网络模型都自动输出启动、结束日志,可以自定义仿真内核类:
1. 实现自定义仿真类
#include <omnetpp.h> using namespace omnetpp; class CustomSim : public cSimulation { protected: virtual void setup() override { cSimulation::setup(); EV << "The simulation is started"; } virtual void shutdown() override { EV << "The simulation is finished"; cSimulation::shutdown(); } };
2. 替换主入口的仿真实例
修改项目的main.cc文件,使用自定义的仿真类启动:
int main(int argc, char *argv[]) { CustomSim sim; return sim.run(argc, argv); }
注意:如果需要将日志输出到控制台,请确保ini配置文件中
cmdenv-output-level设置为INFO或更低等级,也可以替换EV为std::cout直接输出到标准输出流。
内容的提问来源于stack exchange,提问作者Reza
相关产品推荐
相关产品推荐

