首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在omnet++中的模块上单独调用finish()

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

Stack Overflow用户
提问于 2015-10-28 16:59:19
回答 1查看 983关注 0票数 2

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

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

在计数器降到零之后,两个模块都调用一个finish()函数。

代码语言:javascript
运行
复制
sender::finish()
{
 EV << "message limit reached \n";
 cancelAndDelete(myEvent);
}

接收器的完成功能:

代码语言:javascript
运行
复制
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文件存在。

终端上还写着simulation fault: core dumped

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

希望描述得足够清楚。谢谢

EN

回答 1

Stack Overflow用户

发布于 2015-10-28 20:16:40

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33397097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档