[英]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.