我正在使用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
文件存在。
终端上还写着simulation fault: core dumped
问题是,在计数器用完后,我如何“暂停”发送方块,让接收方调用它的finish()
函数,这样我就可以看到统计数据并记录我需要的所有数据。
希望描述得足够清楚。谢谢
发布于 2015-10-28 20:16:40
因此,为单个模块调用两个完成并不是正确的事情。因此,为了解决这种情况,我将发送方块中的finish()
函数重命名为done()
。这有助于模拟器提供更好的功能,当接收器上的计数器为零时,将调用finish()
函数,所有数据收集都会完美地进行,甚至显示在消息控制台上。
在使用单独的模块时,需要使用任何其他名称而不是finish()
,例如stopBlock()
或done()
或任何通用名称。确保在完全模拟中只调用finish()
一次。
原因是finish()
函数用于完整的Omnet++环境,如果任何一个块/模块首先调用它,其他模块将停止工作。
https://stackoverflow.com/questions/33397097
复制相似问题