前页 | 后页 |
示例:延迟事件模式
Enterprise Architect支持延迟事件模式。
在状态中创建延迟事件:
- 为国家创建自我过渡。
- 将过渡的“种类”更改为“内部”。
- 将触发器指定为要延迟的事件。
- 在“效果”字段中,键入“ defer();”。
- 选择“模拟>动态模拟>模拟器>打开模拟窗口”。还要选择“模拟>动态模拟>事件”以打开“模拟事件”窗口。
- 模拟器事件窗口可帮助您触发事件;双击“等待触发器”列中的触发器。
- Simulation窗口以文本形式显示执行。您可以在Simulator命令行中键入“ dump”,以显示队列中延迟了多少个事件。输出可能类似于以下内容:
24850060]事件池:[NEW,NEW,NEW,NEW,NEW,]
延迟事件示例
本示例显示了使用“延迟事件”的模型,“模拟事件”窗口显示了所有可用事件。
我们首先建立上下文(包含StateMachines的Class元素),在简单的上下文中模拟它们,并从其外部引发事件;然后使用Send事件机制在客户端-服务器上下文中进行仿真。
创建上下文和状态机
创建服务器上下文
创建一个类图并:
- 一个Class元素TransactionServer ,向其添加StateMachine ServerStateMachine 。
- 一个Class元素TestClient ,您要在其中添加StateMachine ClientStateMachine 。
- 从TestClient到TransactionServer的关联,目标角色名为server。
为 ServerStateMachine 建模
- 在StateMachine图中添加一个Initial Node Initial ,然后过渡到State idle 。
- 转换(事件NEW_REQUEST作为触发器)到状态busy 。
- 过渡(使用事件QUIT作为触发)到最终状态决赛。
- 转换(事件AUTHORIZED作为触发器)到idle 。
- 转换为繁忙状态 (事件NEW_REQUEST作为Trigger和defer();生效)
ClientStateMachine的 建模
- 向StateMachine图中添加一个Initial Node Initial ,然后过渡到State State0 。
- 转换(以事件RUN_TEST作为触发器)到State State1 。
- 过渡到状态State2 (效果:%SEND_EVENT(“ NEW_REQUEST”,CONTEXT_REF(服务器))%;) 。
- 过渡到状态State3 (效果为:%SEND_EVENT(“ NEW_REQUEST”,CONTEXT_REF(server))%;)。
- 过渡到State State4 (效果:%BROADCAST_EVENT(“ NEW_REQUEST”)%;)。
- 过渡(有效果:%SEND_EVENT( “授权”,CONTEXT_REF(服务器))%),以一国State5。
- 过渡到决赛状态决赛。
在简单环境中进行仿真
创建仿真工件
- 创建名称为Simulation with Deferred Event的可执行文件StateMachine Artifact,并将“ Language”字段设置为JavaScript。
- 将其放大,然后按住Ctrl键并将TransactionServer元素拖动到工件上,并将其粘贴为名称服务器的属性。
运行模拟
- 选择工件,然后选择“模拟>可执行状态>状态机>生成,构建和运行”选项,并为您的代码指定目录(注意:目录中的所有文件将在模拟开始前被删除)。
- 单击生成按钮。
- 选择“模拟>动态模拟>事件”选项,以打开“模拟事件”窗口。
当模拟开始时, 空闲将变为活动状态。
- 在“模拟事件”窗口中双击NEW_REQUEST以将其执行为触发器;退出空闲并激活忙 。
- 在“模拟事件”窗口中双击NEW_REQUEST,再次将其作为触发器执行; 繁忙保持激活状态,并且在事件池中附加了一个NEW_REQUEST实例。
- 在“模拟事件”窗口中双击NEW_REQUEST,以第三次执行该触发器; 繁忙保持激活状态,并且在事件池中附加了一个NEW_REQUEST实例。
- 在“模拟”窗口命令行中键入dump ;请注意,事件池具有两个NEW_REQUEST实例。
- 在“模拟事件”窗口中双击“授权”以将其作为触发器执行;这些动作发生:
- 忙碌退出, 空闲变为活动状态
-从池中检索到一个NEW_REQUEST事件,退出了空闲状态 ,并且忙碌状态变为活动状态 - 在“模拟”窗口命令行中键入dump ;现在,事件池中只有一个NEW_REQUEST实例。
通过发送/广播事件进行交互式模拟
创建仿真工件
- 创建一个名称为“ Interactive Simulation with Deferred Event”的“ Executable StateMachine Artifact”,并将“ Language”字段设置为JavaScript;扩大元素。
- +将TransactionServer元素拖放到工件上,并将其作为属性粘贴到名称服务器。
- 按住Ctrl键并将TestClient元素拖放到工件上,并将其作为属性粘贴到名称client上 。
- 创建一个从客户端到 服务器的连接器。
- 单击连接器,然后按Ctrl + L以选择从TestClient元素到TransactionServer元素的关联。
运行交互式仿真
- 以与简单上下文相同的方式启动仿真。
模拟开始后, 客户端将保持在State0 ,而服务器将保持空闲状态 。
- 在“模拟事件”窗口中双击RUN_TEST来触发它。 NEW_REQUEST事件将被触发3次(由SEND_EVENT和BROADCAST_EVENT触发),而AUTHORIZED事件将由SEND_EVENT触发一次。
在“模拟”窗口命令行中键入dump ,事件池中还有一个NEW_REQUEST实例。结果与我们的手动触发测试相符。