使用队列块管理消息
这个例子展示了如何使用Queue块来存储和排队消息。Queue块允许您在消息转换期间指定消息存储容量、覆盖策略和排序策略。
使用队列排序策略操作消息转换
的队列Block支金宝app持三种消息排序策略:
后进先出(LIFO)——存储中最新的消息首先离开。
先进先出(FIFO)——存储中最早的消息首先离开。
优先级——消息根据它们的优先级进行排序。优先级队列只能在如果队列已满,则覆盖最老的元素复选框被清除。
中引入的一个简单的基于消息的通信模型动画和理解发送和接收消息.该模型包括消息流1和消息流2,其中消息从正弦波1流向Scope1,从正弦波2流向Scope2。
模型描述
在消息流1和消息流2中:
的样品时间“正弦波1”和“正弦波2”参数设置为
0.1
.它们是相同的正弦波源。
的样品时间Receive1和Receive2的参数设置为
0.5
.它们是相同的接收块。
Queue1和Queue2的容量为
One hundred.
.两个队列具有相同的容量。
Queue1的排序策略为
后进先出
而Queue2为先进先出
,显示在块标签下方。两种消息流场景之间的唯一区别是队列排序策略。
记录“sinwave1”、“Receive1”和“Receive2”之间的信号。
模拟模型并回顾结果
在仿真数据检查器中模拟模型并观察结果。
观察正弦波1的输出。SineWave2的输出不显示,因为它与SineWave1相同。还可以观察到来自Receive1的信号是正弦波的表示,但样本之间的间隔更长。然而,来自Receive2的信号是到达正峰值的正弦波的第一部分,因为Queue块的排序策略设置为先进先出
而且它的容量大到足以存储消息。
队列块消息覆盖策略
当队列已满时,您还可以指定Queue块消息覆盖策略:
默认情况下,如果队列已满,则覆盖最老的元素选中复选框。该块被设置为始终接受传入消息,覆盖存储中最老的消息。在这种情况下,块将覆盖最老的消息,但是离开块的消息由队列排序策略决定。
在这个队列行为示例中,消息是根据它们到达具有容量的FIFO和LIFO队列的时间进行枚举的8
.有数字的新消息9
的到来。在FIFO和LIFO情况下,消息9
替换消息1,因为它是队列中最老的元素。但是,在这个过程中观察队列的头部和尾部的变化。在FIFO队列中,消息2
首先离开,因为这是最古老的消息之后1
被替换。在LIFO队列中,消息9
首先离开,因为它是到达存储的最后一条消息。消息离开后,有新的消息10
的到来。队列接受新消息到其空存储bin。
如果如果队列已满,则覆盖最老的元素复选框被清除,则队列块的图标将发生变化,并且当队列满时,该块将不接受新的消息。这是阻塞队列行为。
启用了覆盖策略的队列块
在QueueSortingPoliciesModelSequenceViewer模型中,消息流1和消息流2中的队列块的容量被更改为15
.减少容量会导致传入消息覆盖存储中的现有消息。
模拟模型并打开Sequence Viewer块。在序列查看器块中,向上滚动或单击参加第一场活动左边的图标。观察基于FIFO和LIFO策略离开块的消息。
两个Queue块的容量都有限。当它们的容量已满时,新的传入消息将覆盖队列中最老的现有消息。向下滚动并观察Sequence Viewer块显示了覆盖现有消息的消息。
阻塞队列行为的一个例子
打开QueueOverWritingPolicyModel检查阻塞队列行为。
在接收块中,设置样品时间参数0.5
.
在Queue块中观察到:
的如果队列已满,则覆盖最老的元素复选框被清除。观察块图标的变化。
的能力参数设置为
16
.
在统计数据选项卡,离开的实体数量d而且块中的实体数,n选中复选框。
模拟模型并回顾结果
模拟模型。观察诊断查看器中显示的警告。日志含义模拟时Send块发送的消息被丢弃。
时,Queue块阻塞消息如果队列已满,则覆盖最老的元素复选框被清除。您可以增加Queue块的容量以防止消息丢失。
使用统计数据分析队列行为
当如果队列已满,则覆盖最老的元素复选框被清除统计数据TAB已启用。使用统计数据选项卡来启用输出端口,并观察Queue块统计信息。代码生成不支持统计信息。金宝app
观察标记为“块中的消息数量”和“离开的消息数量”的信号。到模拟时间为止2
,有16
消息的存储,即队列容量。在此之后,“块中的消息数量”接受值15
而且16
因为消息每隔0.5
模拟时间,到达一条新消息。
在模拟时10
,总数为21
消息离开块。
使用事件动作
你也可以使用事件动作,当如果队列已满,则覆盖最老的元素复选框被清除。代码生成不支持事件操作。金宝app有关更多信息,请参见事件和事件处理(SimEvents).
使用事件动作指定消息在某些事件中的行为。例如,条目和退出在消息进入之后和消息退出之前调用操作。的阻塞在消息被阻塞后调用动作。
有关更多信息,请参见建模一个基于消息可用性运行的消息接收接口.
您还可以使用来自SimEvents®库的块来建模更复杂的通信策略,这需要SimEvents®许可证。