我是OMNET ++的新手,需要你的帮助。我正在进行模拟,其中数据包需要从一个模块转到另一个模块,而无需等待第一个模块发送所有数据包。
from matplotlib import gridspec
fig = plt.figure(figsize = (8.5,11))
gs = gridspec.GridSpec(2, 4, width_ratios=[.48,.02,.48,.02],wspace=0,hspace=0)
for i in [0,1]:
for j in [0,2]:
d = np.random.random((200,200))
ax = fig.add_subplot(gs[i,j])
ax_cb = fig.add_subplot(gs[i,j+1])
sns.heatmap(d,cmap='jet',ax=ax, cbar_ax=ax_cb)
gs.tight_layout(fig)
现在,如果模块A通过模块B向模块C发送5个数据包,则模块B等待所有5个数据包接收,并且在收到所有5个数据包后,开始发送到模块C。
我想要的是,如果模块B接收到数据包,它需要直接发送到模块C而无需等待模块A发送所有数据包。
请查看附图以供参考。在此图像中,您可以看到中间4个模块保留所有数据包并在模块1发送所有数据包时开始转发。
感谢你的帮助。
JTextField
------------- ------------ -------------
| Module A | --> | Module B | --> | Module C |
------------- ------------ -------------
#include <string.h>
#include <omnetpp.h>
#include <iostream>
#include <cstdlib>
using namespace omnetpp;
class QKDProcessor : public cSimpleModule
{
private:
int randomGate;
int counter = 0 ;
protected:
virtual void handleMessage(cMessage *msg) override;
};
Define_Module(QKDProcessor);
void QKDProcessor::handleMessage(cMessage *msg)
{
if(strcmp("QuantumStatesProcessorBob", getName()) == 0)
{
delete msg;
if(counter == 0)
{
cMessage *keyCheck = new cMessage("T");
send(keyCheck,"out",0);
}
counter++;
}
else
{
std::string key = msg->getName();
delete msg;
char *stat = new char[key.length()+1];
strcpy(stat, key.c_str());
for(int i=0; i<key.length(); i++)
{
// Selecting random gates
double x = rand()/static_cast<double>(RAND_MAX+1);
randomGate = 0 + static_cast<int>( x * (4 - 0) );
// Create individual message for each bit.
std::string j = std::string(1,stat[i]);
cMessage *quantumState = new cMessage(j.c_str());
send(quantumState,"out", randomGate);
}
}
}
答案 0 :(得分:3)
正如Jerzy建议的那样,您的模拟工作正常。假设您没有在模块之间的通道上设置延迟,您所看到的是所有这些消息交换同时发生(t = 0),而不是像实际动画所暗示的那样。在模拟时间内,这些消息发生在同一时间。观看右上角的模拟时间显示。它在这些消息交换期间没有进展但保持为0,因此您假设模块B在收到消息后不立即发送是假的。虽然这些消息交换发生在相同的模拟时间,但模拟器在动画期间将它们序列化以便更好(或更糟)。或者换句话说,这里有两个不同的时间轴:模拟时间和动画时间。这两者并不相同,有时可能令人困惑。
现在,如果您想要查看更符合模拟时间的动画,您应该转到动画选项对话框并启用广播动画。该模式收集在同一事件中发生的所有事件(消息发送)并并行动画它们。你会看到模块A发送的所有消息并行动画,并且在模块B发送给C之后,请注意,这仍然不是镜像现实(模拟时间),因为它只动画那些并行发生的消息。同一事件(不是那些在同一模拟时间发生的事件)。即实际上,模块A和B都将同时发送消息,并且视频上的所有消息交换应该立即动画化。然而,该动画也会误导消息发送的图形实现,其中一个点沿着连接线传播,因为在这种情况下,您将丢失因果信息(即,您不会看到来自模块B的消息实际上是由从模块A传入的消息,因此这种模式也会产生误导。这就是为什么OMNeT ++只回归动画来自同一事件的消息。
动画的第三种方式是摆脱旅行的点,然后闪烁显示消息交换发生的连接线。但是,如果屏幕上的所有连接同时闪烁,也会丢失信息,原因影响关系将再次丢失。
实际上,信息永远不会在物理实体之间以无限速度传播,因此某种延迟总是在它们之间的通道上是合理的。这对动画很有帮助。最后的建议是,您应该使用最新版本的OMNeT ++和Qtenv,因为它大大提高了动画功能。