【问题标题】:How to send one msg to next module after receiving all messages from previous module in OMNET++在 OMNET++ 中接收到上一个模块的所有消息后如何将一个消息发送到下一个模块
【发布时间】:2019-05-27 14:39:08
【问题描述】:

需要你的帮助。

我有三个模块 Module A、Module B 和 Module C。

Module A 向 Module B 发送 20 条消息。我想在收到 Module A 的所有 20 条消息后向 Module C 发送一个数据包。我如何在 handleMessage 上处理这种情况?

目前它像循环一样运行。每次到达时都会发送一条消息。我需要的是从前一个模块收集所有消息,从中收集数据,准备一条消息并将一条消息发送到下一个模块。

================================================ ==

谢谢000102

您的第一个解决方案运行良好。我只是在为第二种解决方案而苦苦挣扎。所以请帮我解决这个问题。请检查下面的代码,让我知道我错在哪里。

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;
            }
}

【问题讨论】:

    标签: c++ simulation omnet++


    【解决方案1】:

    我认为您正在寻找这样的东西:

    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");
        }
    }
    

    【讨论】:

    • 非常感谢,请问我该如何处理传入消息数量未知的问题?
    • 在这种情况下,您只需将 if 条件替换为类似于 if (simTime() - lastMessageReceivedAt &gt;= timer &amp;&amp; sentMessage == false) 的内容。在 else 条件中添加 lastMessageReceivedAt = simTime(); 并在模块 B 将数据包发送到模块 C 后添加 sentMessage = true;
    • 谢谢,您的第一个解决方案在知道数据包数量的情况下非常好。我正在为第二种解决方案而苦苦挣扎。我更新了问题,请检查并让我知道我错在哪里。我认为与计时器有关。
    • 您需要在initialize() 中设置您的计时器,就像之前为计数器所做的那样。还要在 else 条件之后添加lastMessageReceivedAt = simTime(); 而不是在里面(我在这里不好)。您实际上想知道您的模块上次收到消息的时间并将该值与您的计时器比较。 simTime() - lastMessageReceivedAt &gt;= timer。当 ModuleB 有一段时间没有收到消息时,它会向 ModuleC 发送消息
    • 它可以工作,但反过来。它在处理其他消息之前发送消息。因为 lastMessageReceivedAt 最初为 0,所以 if 语句在第一阶段为真,在设置 lastMessageReceivedAt = simTime() 之后,它永远不会回到那个 if 语句。
    猜你喜欢
    • 2022-11-18
    • 1970-01-01
    • 2021-06-10
    • 2022-01-02
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多