Omnet 在我的班级中添加功能

Omnet++ Adding functionalities to handleMessage in my class

本文关键字:添加 功能 我的 Omnet      更新时间:2023-10-16

我有一个错误,试图在我的队列类中继承handlemessage(gatedroptailqueue),它是从droptailqueue继承的,而droptailqueue又从passivequeuebase继承。

class INET_API GateDropTailQueue: public DropTailQueue {
private:
    cMessage *msg1;
    cMessage *msg2;
protected:
    virtual void initialize() override;
    virtual void handleMessage(cMessage *msg) override;
... 
};
 void GateDropTailQueue::initialize()
{
    DropTailQueue::initialize();
msg1 = new cMessage("msg1"); scheduleAt(2, msg1); msg1 = nullptr;
...
}   

void GateDropTailQueue::handleMessage(cMessage *msg)
{
    DropTailQueue::handleMessage(msg);
if (msg == msg1) {
msg1 = new cMessage("msg1"); scheduleAt(10, msg1); msg1 = nullptr;
msg2 = new cMessage("msg2"); scheduleAt(2, msg2); msg2 = nullptr;
...
}
else if (msg == msg2) {
msg2 = new cMessage("msg2"); scheduleAt(2, msg2); msg2 = nullptr;
...
}
}

我有以下错误

模块中的错误(inet :: gatedroptailqueue) mySimulation.switch.eth [0] .Queue.queue1(ID = 33)事件#12,t = 2: 发出错误类的信号" rcvdpk"(omnetpp :: cmessage没有 从Omnetpp :: cpacket声明)。

此错误与被动标语中的handlemessage中的第一行有关

// PassiveQueueBase.cc
namespace inet { 
simsignal_t PassiveQueueBase::rcvdPkSignal = registerSignal("rcvdPk");
    void PassiveQueueBase::handleMessage(cMessage *msg)
    {  numQueueReceived++;
       emit(rcvdPkSignal, msg);
       ...
    }
}

可能在模型的NED文件中您有此行:

@signal[rcvdPk](type=cPacket);

这意味着rcvdPk信号可以用cPacket对象发射,而不是使用cMessage。您应该做的是将msg施放到cPacket,例如这样:

void PassiveQueueBase::handleMessage(cMessage *msg)
{  numQueueReceived++;
   cPacket * pkt = dynamic_cast<cPacket *> (msg);
   if (pkt) {
       emit(rcvdPkSignal, pkt);
   } else {
       // ... not a cPacket
   }
   ...
}

它是通过在父式处理(cmessage * msg)上的条件来解决的

 if (!msg->isSelfMessage()) { ... }
// while it didn't work using the condition
if (msg != msg1 && msg != msg2) { ... }