前页 后页

示例:叉子和联接

叉状伪状态将传入的转换分为两个或多个转换,终止于复合状态正交区域中的顶点。从Fork伪状态传出的Transitions不能具有保护或触发器,并且至少在概念上彼此独立地执行各个传出Transitions的效果行为。

连接伪状态是源自不同正交区域中顶点的两个或多个过渡的通用目标顶点。连接伪状态执行同步功能,由此所有传入的Transition必须完成,才能继续执行通过传出的Transition。

在此示例中,我们演示了具有Fork和Join伪状态的StateMachine的行为。

建模StateMachine

Example StateMachine diagram with Fork/Joins in Sparx Systems Enterprise Architect

StateMachine的上下文

  • 创建一个名为MyClass的Class元素,该元素用作StateMachine的上下文
  • 在“浏览器”窗口中右键单击MyClass ,然后选择“添加| StateMachine的选项

状态机

  • 向图中添加一个初始节点,一个Fork ,一个名为State1的State,一个Join和一个Final。
  • 放大State1 ,右键单击它 在图表上,然后选择“高级|定义并发子状态定义”选项并定义RegionARegionB
  • RegionA中 ,定义StateA1 ,由事件X触发到StateA2的转换
  • RegionB中 ,定义StateB1 ,由事件Y触发向StateB2的转换
  • 绘制其他过渡:从初始叉子分叉StateA1StateB1 ; 加入 StateA2和StateB2 ; 加入 决赛

模拟

神器

Enterprise Architect支持C,C ++,C#,Java和JavaScript;在此示例中,我们将使用JavaScript,因为我们不需要安装编译器(对于其他语言,则需要Visual Studio或JDK)。

  • 从图工具箱中选择“工件”页面,并将“可执行状态机”图标拖到图上以创建工件;将其命名为ForkNJoinSimulation并将其“语言”字段设置为“ JavaScript”
  • 从浏览器窗口中按Ctrl +拖动MyClass并将其作为属性拖放到ForkNJoinSimulation工件上;给它起名myClass
Executable StateMachine for SysML simulation in Sparx Systems Enterprise Architect

代码生成

  • 单击ForkNJoinSimulation,然后选择“模拟>可执行状态>状态机>生成,构建和运行”功能区选项
  • 为生成的源代码指定目录
注意:该目录的内容将在生成之前清除;确保指向仅用于StateMachine模拟目的的目录。

Fork and Join during simulation of executable state machine

运行模拟

当模拟开始时, State1StateA1StateB1处于活动状态,并且StateMachine正在等待事件。

Fork and Join during simulation of executable state machine

选择“模拟>动态模拟>事件”功能区选项,以显示“模拟事件”窗口。

在触发事件X中StateA1将退出并进入StateA2 ;在entry和doActivity行为运行之后,将调度并重新调用StateA2的完成事件。然后,启用并遍历从StateA2Join伪状态的转换。

注意: 连接必须等待所有传入的转换完成,然后才能继续执行输出的转换。由于来自RegionB的分支尚未完成(因为StateB1仍处于活动状态并且正在等待触发器),因此此时将不执行从JoinFinal的转换。

Fork and Join during simulation of executable state machine

在触发事件Y下StateB1将退出并进入StateB2 ;在entry和doActivity行为运行之后,将调度并重新调用StateB2的完成事件。然后,启用并遍历从StateB2Join伪状态的转换。这满足了Join的所有传入转换已完成的条件,因此将执行从JoinFinal的转换。模拟已结束。

提示:您可以从“模拟”窗口中查看执行跟踪序列(“模拟>动态模拟>模拟器>打开模拟窗口”功能区选项)。

myClass [MyClass] .Initial_82285__TO__fork_82286_82286_61745效果

myClass [MyClass] .StateMachine_State1 ENTRY

myClass [MyClass] .StateMachine_State1 DO

myClass [MyClass] .fork_82286_82286__TO__StateA1_57125效果

myClass [MyClass] .StateMachine_State1_StateA1 ENTRY

myClass [MyClass] .StateMachine_State1_StateA1 DO

myClass [MyClass] .fork_82286_82286__TO__StateB1_57126效果

myClass [MyClass] .StateMachine_State1_StateB1 ENTRY

myClass [MyClass] .StateMachine_State1_StateB1 DO

触发X

myClass [MyClass] .StateMachine_State1_StateA1退出

myClass [MyClass] .StateA1__TO__StateA2_57135效果

myClass [MyClass] .StateMachine_State1_StateA2 ENTRY

myClass [MyClass] .StateMachine_State1_StateA2 DO

myClass [MyClass] .StateMachine_State1_StateA2退出

myClass [MyClass] .StateA2__TO__join_82287_82287_57134效果

触发Y

myClass [MyClass] .StateMachine_State1_StateB1退出

myClass [MyClass] .StateB1__TO__StateB2_57133效果

myClass [MyClass] .StateMachine_State1_StateB2 ENTRY

myClass [MyClass] .StateMachine_State1_StateB2 DO

myClass [MyClass] .StateMachine_State1_StateB2退出

myClass [MyClass] .StateB2__TO__join_82287_82287_57132效果

myClass [MyClass] .StateMachine_State1退出

myClass [MyClass] .join_82287_82287__TO__Final_105754_57130效果