C++ 如何在OMNET+中接收到来自前一个模块的所有消息后,将一条消息发送到下一个模块+;
我需要你的帮助 我有三个模块:模块A、模块B和模块C 模块A向模块B发送20条消息。在收到模块A发送的所有20条消息后,我想向模块C发送一个数据包。如何在handleMessage上处理这种情况 目前,它像一个环路一样运行。每次到达时,它都会发出一条消息。我需要的是收集来自前一个模块的所有消息,从中收集数据,准备一条消息并将一条消息发送到下一个模块 ================================================= 谢谢 您的第一个解决方案工作得非常好。我只是在努力寻找第二个解决方案。所以请帮我解决这个问题。请检查下面的代码,让我知道我错在哪里C++ 如何在OMNET+中接收到来自前一个模块的所有消息后,将一条消息发送到下一个模块+;,c++,simulation,omnet++,C++,Simulation,Omnet++,我需要你的帮助 我有三个模块:模块A、模块B和模块C 模块A向模块B发送20条消息。在收到模块A发送的所有20条消息后,我想向模块C发送一个数据包。如何在handleMessage上处理这种情况 目前,它像一个环路一样运行。每次到达时,它都会发出一条消息。我需要的是收集来自前一个模块的所有消息,从中收集数据,准备一条消息并将一条消息发送到下一个模块 ================================================= 谢谢 您的第一个解决方案工作得非常好。我只是在努
class ModuleB: public cSimpleModule
{
protected:
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
private:
bool sentMessage = false;
simtime_t lastMessageReceivedAt;
simtime_t timer;
};
void ModuleB::initialize()
{
}
void ModuleB::handleMessage(cMessage *msg)
{
if(simTime() - lastMessageReceivedAt >= timer && sentMessage == false)
{
EV << counter << " messages to receive before sending.\n";
// Data collection
}
else
{
lastMessageReceivedAt = simTime();
EV << " Send message to Module C.\n";
cMessage *newMsg = new cMessage("Message")
send(newMsg, "out");
sentMessage = true;
}
}
类模块B:公共cSimpleModule
{
受保护的:
虚拟void initialize()覆盖;
虚拟无效handleMessage(cMessage*msg)覆盖;
私人:
bool sentMessage=false;
simtime_t last message received数据;
同步定时器;
};
void ModuleB::initialize()
{
}
void ModuleB::handleMessage(cMessage*msg)
{
if(simTime()-lastMessageReceivedAt>=timer&&sentMessage==false)
{
EV我想你在寻找这样的东西:
class ModuleB : public cSimpleModule {
private:
int counter;
protected:
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
};
void ModuleB::initialize() {
counter = 20;
}
void ModuleB::handleMessage(cMessage *msg) {
counter--;
if (counter > 0) {
EV << counter << " messages to receive before sending.\n";
// Data collection
}
else {
EV << " Send message to Module C.\n";
cMessage *newMsg = new cMessage("Message");
send(newMsg, "out");
}
}
类模块B:公共cSimpleModule{
私人:
整数计数器;
受保护的:
虚拟void initialize()覆盖;
虚拟无效handleMessage(cMessage*msg)覆盖;
};
void ModuleB::initialize(){
计数器=20;
}
void ModuleB::handleMessage(cMessage*msg){
计数器--;
如果(计数器>0){
EV我想你在寻找这样的东西:
class ModuleB : public cSimpleModule {
private:
int counter;
protected:
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
};
void ModuleB::initialize() {
counter = 20;
}
void ModuleB::handleMessage(cMessage *msg) {
counter--;
if (counter > 0) {
EV << counter << " messages to receive before sending.\n";
// Data collection
}
else {
EV << " Send message to Module C.\n";
cMessage *newMsg = new cMessage("Message");
send(newMsg, "out");
}
}
类模块B:公共cSimpleModule{
私人:
整数计数器;
受保护的:
虚拟void initialize()覆盖;
虚拟无效handleMessage(cMessage*msg)覆盖;
};
void ModuleB::initialize(){
计数器=20;
}
void ModuleB::handleMessage(cMessage*msg){
计数器--;
如果(计数器>0){
EV非常感谢您,我如何处理传入消息数量未知的问题?在这种情况下,您只需将if条件替换为类似于if(simTime()-lastMessageReceivedAt>=timer&&sentMessage==false)
。添加lastMessageReceivedAt=simTime();
在else条件下,并且sentMessage=true;
一旦您的模块B将数据包发送到模块C。谢谢,您的第一个解决方案在知道数据包数量的情况下非常好。我正在努力解决第二个解决方案。我更新了问题,请检查并让我知道我错在哪里。我认为与计时器有关的问题。您需要o在initialize()
中设置计时器,就像您之前对计数器所做的那样。还要在else条件之后添加lastMessageReceivedAt=simTime();
,而不是在内部(此处我的错误)。您实际上想知道模块上次收到消息的时间,并将此值与计时器进行比较cf.simTime()-lastMessageReceivedAt>=timer
。当ModuleB有一段时间没有收到消息时,它会向ModuleIts发送一条消息,但会反过来工作。它会在处理其他消息之前发送消息。因为lastMessageReceivedAt最初为0,所以if语句在第一阶段和设置lastMessageReceivedAt=simTime()后为true它永远不会回到if语句。非常感谢,我如何处理传入消息数量未知的问题?在这种情况下,您只需要用类似于if(simTime()-lastMessageReceivedAt>=timer&&sentMessage==false)
的东西替换if条件。添加lastMessageReceivedAt=simTime();
在else条件下,并且sentMessage=true;
一旦您的模块B将数据包发送到模块C。谢谢,您的第一个解决方案在知道数据包数量的情况下非常好。我正在努力解决第二个解决方案。我更新了问题,请检查并让我知道我错在哪里。我认为与计时器有关的问题。您需要o在initialize()
中设置计时器,就像您之前对计数器所做的那样。还要在else条件之后添加lastMessageReceivedAt=simTime();
,而不是在内部(此处我的错误)。您实际上想知道模块上次收到消息的时间,并将此值与计时器进行比较cf.simTime()-lastMessageReceivedAt>=timer
。当ModuleB有一段时间没有收到消息时,它会向ModuleIts发送一条消息,但会反过来工作。它会在处理其他消息之前发送消息。因为lastMessageReceivedAt最初为0,所以if语句在第一阶段和设置lastMessageReceivedAt=simTime()后为true它永远不会回到那个if语句。