2015-10-28 26 views
2

我使用Omnet ++并创建了一个发件人不断向发件人发送数据包(从发件人到接收方的单向通信)的情况,并且我已经在发送者和接收者的简单模块。如何在omnet ++中的模块上单独调用finish()

由于发送方的计数器首先比接收方倒数至零,模拟运行良好,但由于接收方完成所有操作,因此它不记录统计数据。

计数器减为零后,两个模块都调用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()函数,这样我可以看到的统计数据,并记录所有我需要的数据?

希望描述足够清楚。 谢谢

+0

消息'模拟故障:核心转储'意味着模拟过程中出现**错误**。尝试调试您的模拟以确定哪条指令导致该错误。或者在你的问题中提出你的整个代码。 –

+0

发现故障并发布了答案。 :) –

回答

1

所以事实证明,调用两个完成个别模块是不正确的。因此,为了处理这种情况,我将发件人块中的finish()函数重命名为done()。这有助于模拟器提供更好的功能,以及接收器上的计数器何时归零,并且所有数据收集完全发生并且甚至在消息控制台上显示。

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

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

相关问题