gpt4 book ai didi

c++ - 如何在 omnet++ 中的模块上单独调用 finish()

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:16:05 26 4
gpt4 key购买 nike

我正在使用 Omnet++ 并创建一个场景,其中发送方不断向接收方发送数据包(从发送方到接收方的单向通信),并且我在发送方和接收方的两个简单模块上都设置了一个计数器。

由于发送方的计数器比接收方先倒数到零,因此模拟运行良好但它不记录统计信息,因为所有这些都是在接收方完成的。

在计数器减为零后,两个模块都会调用 finish() 函数。

sender::finish()
{
EV << "message limit reached \n";
cancelAndDelete(myEvent);
}

接收者的结束函数:

void receiver::finish()
{
EV << "mean: "<< iatStats.getMean() << endl;
EV << "std.dev: " << iatStats.getStddev() << endl;
EV << "variance: " << iatStats.getVariance() << endl;

iatStats.recordAs("Inter-Arrival Times");
recordScalar("#IAT", interAT_diff);
}

这里的 iat 是计算接收方数据包之间的到达间隔时间。

模拟运行后,首先调用发送方的finish(),模拟停止,/results文件夹中没有数据记录,只有空白.vec .sca 文件存在。

终端还显示模拟错误:核心转储

问题是一旦计数器用完,我如何“暂停”发送方 block 并让接收方调用它的 finish() 函数,这样我就可以看到统计数据并记录所有我需要的数据?

希望描述足够清楚。谢谢

最佳答案

事实证明,为单个模块调用两个完成是不正确的。因此,为了解决这种情况,我将发送方 block 中的 finish() 函数重命名为 done()。这有助于模拟器提供更好的功能,当接收器上的计数器归零时,调用 finish() 函数,所有数据收集完美发生,甚至显示在消息控制台上.

在使用单独的模块时,需要使用任何其他名称而不是 finish(),例如stopBlock()done() 或任何通用名称。确保 finish() 在完整模拟中被调用 ONLY ONCE

原因是 finish() 函数是针对完整的 Omnet++ 环境的,如果任何一个 block /模块首先调用它,其他模块将停止运行。

关于c++ - 如何在 omnet++ 中的模块上单独调用 finish(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33397097/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com