C++ 如何在OMNET+中接收到来自前一个模块的所有消息后,将一条消息发送到下一个模块+;

C++ 如何在OMNET+中接收到来自前一个模块的所有消息后,将一条消息发送到下一个模块+;,c++,simulation,omnet++,C++,Simulation,Omnet++,我需要你的帮助 我有三个模块:模块A、模块B和模块C 模块A向模块B发送20条消息。在收到模块A发送的所有20条消息后,我想向模块C发送一个数据包。如何在handleMessage上处理这种情况 目前,它像一个环路一样运行。每次到达时,它都会发出一条消息。我需要的是收集来自前一个模块的所有消息,从中收集数据,准备一条消息并将一条消息发送到下一个模块 ================================================= 谢谢 您的第一个解决方案工作得非常好。我只是在努

我需要你的帮助

我有三个模块:模块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语句。