You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OMNeT++仿真的起点及终点函数是什么?如何添加对应日志?

OMNeT++ 仿真启动入口与结束回调使用说明

核心可自定义钩子说明

  • 仿真启动钩子(两类常用实现):
    • 应用层级:顶层网络模块(即ini文件中network参数指定的根模块)的initialize()(多阶段初始化的最后阶段),所有子模块初始化完成、仿真事件循环启动前执行,无需修改仿真内核即可实现,适配单项目需求
    • 内核层级:自定义cSimulation子类的setup()函数,仿真内核初始化完成后执行,可实现全项目通用的启动逻辑
  • 仿真结束钩子(两类常用实现):
    • 应用层级:顶层网络模块的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:54:00