omnet++:cMessage、cSimpleModule、cGate


cMessage

Message可以被調度(self-message)取消從一個Gate發送出去直接發給另一個module;所有以上,都是通過cSimpleModule來實現的。

Message在創建時可以指定名字,其它信息包括消息類型、優先級、時間戳。控制信息字段允許我們使用模型模擬協議層間的通信。context pointer字段允許我們在同一時間是用多個計時器。一個Message中也存儲了關於該消息的最后一次發送的信息,例如發送時間、到達時間、到達的module和gate

isSelfMessage可以幫助我們區分self-message和來自其他節點的消息。

如果需要一些更多的字段,可以通過msg文件創建一個Message,它會自動繼承cMessage的相關方法。

方法(msg->xxx()) 說明
setName(const char *) 設置消息名
const char * getName() 返回消息名
dup()

返回消息的副本;

cMessage * copy = msg->dup();

int getSenderModuleId() 獲得發送該消息的Module的ID
int getSenderGateId() 獲得發送該消息的Gate的ID
int getArrivalModuleId() 獲得該消息將要到達的Module的ID
int getArrivalGateId() 獲取該消息將要到達的Gate的ID
bool isSelfMessage() 判斷消息是否是SelfMessage
 cModule  * getSenderModule() 獲取指向發送該消息Module的指針 
cGate * getSenderGate() 返回一個指針,指向該消息上一次發送時的gate
cModule * getArrivalModule() 返回指向該消息到達Module的指針
cGate * getArrivalGate() 返回一個指針,指向該消息從哪個Gate到達

bool arrivedOn(int gateId)

bool arrivedOn(char * gateName , int gateIndex)

如果該消息通過給定的gate到達了,就返回true

long getId() 獲取消息ID
virtual const char * getDisplayString() 展示消息在運行時的顯示String
void setArrival(int moduleId,int gateId) 定制調度器,直接由調度器設置消息要到達的模塊和Gate

cModule

cModule是cSimpleModule的父類,cSimpleModuel在cModule的基礎上添加了許多方法。

方法 說明
virtual void setName(const char * s) 給Module命名
virtual const char * getFullName() 返回Module的全名,格式為:module名[i]
virtual string getFullPath() 返回Module的路徑,格式為:網絡名.vector名.mudule名[i]
virtual string str()  重寫該方法以添加module ID
virtual cModule * getParentModule() const 返回該Module的父Module,具體分級可以通過getFullPath()方法得到
int getIndex() 獲得該module在vector中的索引
getVectorSize() 獲得該module所在vector的大小
virtual cModule * getSubmodule(const char * name,int index=-1) 返回指向 通過名字和索引指定 的Module
virtual cModule * getModuleByPath(const char * path) 返回通過 module路徑指定的Module 的指針
virtual int gateSize(const char * gatename) 返回gate vector的size
virtual void arrived(cMessage * msg , cGate * ongate , simtime_t) 與send()方法相對應的方法,不過是在另一個Module中調用的。
virtual cCanvas *getCanvas() 返回這個Module的默認canvas

cSimpleModule

主要方法有四個initialize()handleMessage(cMessage * msg)finish()

initialize():omnet++在創建一個Module時調用該方法。

handleMessage(cMessage * msg):當Module收到一個Message時調用該方法。

我們可以使用send()方法向另一個Module發送消息,或者使用scheduleAt()cancelEvent()方法來部署延遲、計時器、超時

finish()函數當仿真成功結束時被調用。該方法的經典用法是記錄下載仿真過程中的統計信息。

方法 說明
virtual void setName(const char * s) 給Module命名
virtual const char * getFullName() 返回Module的全名,格式為:module名[i]
virtual string getFullPath() 返回Module的路徑,格式為:網絡名.vector名.mudule名[i]
virtual string str()  重寫該方法以添加module ID
virtual cModule * getParentModule() const 返回該Module的父Module,具體分級可以通過getFullPath()方法得到
int getIndex() 獲得該module在vector中的索引
getVectorSize() 獲得該module所在vector的大小
virtual cModule * getSubmodule(const char * name,int index=-1) 返回指向 通過名字和索引指定 的Module
virtual cModule * getModuleByPath(const char * path) 返回通過 module路徑指定的Module 的指針
virtual int gateSize(const char * gatename) 返回gate vector的size
virtual void arrived(cMessage * msg , cGate * ongate , simtime_t) 與send()方法相對應的方法,不過是在另一個Module中調用的。
virtual cCanvas *getCanvas() 返回這個Module的默認canvas
virtual void handleMessage(cMessage * msg) 消息處理函數,當有消息到達時被調用
virtual void send( cMessage * msg , const char *gatename , int gateindex=-1) 從指定gate把消息發送出去
virtual sendDelayed(cMessage * msg, simtime_t delay,const char * gatename , int gateindex=-1 ) 延遲delay秒后把消息發送出去
void sendDirect(cMessage * msg,simtime_t propagation Delay,simtime_t duration,cModule * mod,const char * inputGateName , int gateindex=-1) 直接把一個消息發送到其他Module,
void scheduleAt(simtime_t t,cMessage * msg) 發送一個self-message
cMessage * cancelEvent(cMessage * msg) 移除一個消息。常用於我們之前用scheduleAt()部署的消息,用來取消一個計時器
void cancelAndDelete(cMessage * msg) 對msg調用cancelEvent(),之后刪除它。該方法常用於SimpleModule的析構函數中,用於銷毀self-message
void wait(simtime_t time)

等待一段時間。

只用於我們不希望其他消息在這段時間內到達的時候。

cGate

代表了一個Module的gate。

cGate對象被Module創建並管理,使用者通常不會直接創建和銷毀cGate。

const char * getName() 返回gate的名字,不包含索引
const char * getFullName() 返回gate的全名,包含索引
cObject * getOwner() 返回gate的所屬Module
cModule * getOwnerModule() 指向gate所屬Module
int getIndex() 返回gate的索引號
int getVectorSize() 返回gate vector的size
cGate * getPreviousGate() 指向與這個gate相連接的上一個gate
cGate * getNextGate() 指向與這個Gate相連接的下一個Gate


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM