簡體   English   中英

如何在 omnet++ 中的模塊上單獨調用 finish()

[英]How to invoke finish() individually on modules in omnet++

我正在使用 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()函數,以便我可以查看統計信息並記錄我需要的所有數據?

希望描述足夠清楚。 謝謝

所以事實證明,為單個模塊調用兩個完成是不正確的。 因此,為了解決這種情況,我將發送者塊中的finish()函數重命名為done() 這有助於模擬器提供更好的功能,當接收器上的計數器歸零時, finish()函數被調用,所有數據收集都完美地發生,甚至顯示在消息控制台上。

使用單獨的模塊(例如stopBlock()done()或任何通用名稱finish()需要使用任何其他名稱而不是finish() 確保在完整的模擬中調用了finish()一次

原因是finish()函數用於完整的Omnet++ 環境,如果任何一個塊/模塊首先調用它,其他模塊將停止運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM