在OMNet++中何时使用send、sendDirect和sendDelayed?

在OMNet++中何时使用send、sendDirect和sendDelayed?,omnet++,Omnet++,我正在omnet++中构建自己的复合模块,其中包含多个简单模块,并具有分层架构。但是,像my App generator这样只使用发送模块间通信,使用发送将数据包发送到下面的缓冲区,似乎会增加总的网络延迟 此外,我还见过其他支持良好的机型,如inet、mixim等。它们交替使用sendDirect、send和sendDelayed 所以,我的问题是,何时使用send、sendDirect和sendDelayed? 它们之间有延迟差异吗?有几种方法可以在模块之间交换信息。您使用哪种协议实际上取决于

我正在omnet++中构建自己的复合模块,其中包含多个简单模块,并具有分层架构。但是,像my App generator这样只使用发送模块间通信,使用发送将数据包发送到下面的缓冲区,似乎会增加总的网络延迟

此外,我还见过其他支持良好的机型,如inet、mixim等。它们交替使用sendDirect、send和sendDelayed

所以,我的问题是,何时使用send、sendDirect和sendDelayed?
它们之间有延迟差异吗?

有几种方法可以在模块之间交换信息。您使用哪种协议实际上取决于您传递的数据以及该交换与协议本身的关联程度

首先需要澄清的是:使用send或sendDirect不会增加延迟。如果通过正常通道发送消息或使用sendDirect,则消息将在当前模拟时间(即现在)发送到目标模块。当消息在目的地处理时,模拟时间相同,因此模拟时间没有额外延迟。sendDelayed显然增加了延迟,但这是它的主要目的

您必须决定是要使用消息传递作为模块之间的通信手段,这是异步的,还是要直接调用其他同步模块。在第一种情况下,您可以使用OMNeT++的调度功能,即send、sendDelayed、sendDirect等。。在第二种情况下,您通常直接调用另一个模块,方法是获取指向该模块的指针,并可能使用check_和_cast将其转换为适当的类型。getParentModule和findSubmodule等方法在这里非常有用,可以获取指向所需模块的指针

当模块之间的通信被视为“实现”细节时,直接调用非常有用。它在CPU使用和同步方面也更快,因此您可以获得返回值

如果使用GUI运行时环境传递要在模拟过程中检查的数据,即希望看到小点四处飞舞,则应使用消息定义和send/sendDirect等

最后是send和sendDirect之间的区别。如果您有一个通过通道连接闸门的拓扑结构,即您现在可以预先确定通信路径,您通常使用send,例如有线网络。如果您事先不知道通信路径,则通常会获取指向目标模块的指针,但之后使用sendDirect发送异步消息。在无线网络中通常是这样