前页 | 后页 |
示例:叉子和联接
叉状伪状态将传入的转换分为两个或多个转换,终止于复合状态正交区域中的顶点。从Fork伪状态传出的Transitions不能具有保护或触发器,并且至少在概念上彼此独立地执行各个传出Transitions的效果行为。
连接伪状态是源自不同正交区域中顶点的两个或多个过渡的通用目标顶点。连接伪状态执行同步功能,由此所有传入的Transition必须完成,才能继续执行通过传出的Transition。
在此示例中,我们演示了具有Fork和Join伪状态的StateMachine的行为。
建模StateMachine
StateMachine的上下文
- 创建一个名为MyClass的Class元素,该元素用作StateMachine的上下文
- 在“浏览器”窗口中右键单击MyClass ,然后选择“添加| StateMachine的选项
状态机
- 向图中添加一个初始节点,一个Fork ,一个名为State1的State,一个Join和一个Final。
- 放大State1 ,右键单击它 在图表上,然后选择“高级|定义并发子状态定义”选项并定义RegionA和RegionB
- 在RegionA中 ,定义StateA1 ,由事件X触发到StateA2的转换
- 在RegionB中 ,定义StateB1 ,由事件Y触发向StateB2的转换
- 绘制其他过渡:从初始到叉子 ; 分叉到StateA1和StateB1 ; 加入 StateA2和StateB2 ; 加入 决赛
模拟
神器
Enterprise Architect支持C,C ++,C#,Java和JavaScript;在此示例中,我们将使用JavaScript,因为我们不需要安装编译器(对于其他语言,则需要Visual Studio或JDK)。
- 从图工具箱中选择“工件”页面,并将“可执行状态机”图标拖到图上以创建工件;将其命名为ForkNJoinSimulation并将其“语言”字段设置为“ JavaScript”
- 从浏览器窗口中按Ctrl +拖动MyClass并将其作为属性拖放到ForkNJoinSimulation工件上;给它起名myClass
代码生成
- 单击ForkNJoinSimulation,然后选择“模拟>可执行状态>状态机>生成,构建和运行”功能区选项
- 为生成的源代码指定目录
运行模拟
当模拟开始时, State1 , StateA1和StateB1处于活动状态,并且StateMachine正在等待事件。
选择“模拟>动态模拟>事件”功能区选项,以显示“模拟事件”窗口。
在触发事件X中 , StateA1将退出并进入StateA2 ;在entry和doActivity行为运行之后,将调度并重新调用StateA2的完成事件。然后,启用并遍历从StateA2到Join伪状态的转换。
注意: 连接必须等待所有传入的转换完成,然后才能继续执行输出的转换。由于来自RegionB的分支尚未完成(因为StateB1仍处于活动状态并且正在等待触发器),因此此时将不执行从Join到Final的转换。
在触发事件Y下 , StateB1将退出并进入StateB2 ;在entry和doActivity行为运行之后,将调度并重新调用StateB2的完成事件。然后,启用并遍历从StateB2到Join伪状态的转换。这满足了Join的所有传入转换已完成的条件,因此将执行从Join到Final的转换。模拟已结束。
提示:您可以从“模拟”窗口中查看执行跟踪序列(“模拟>动态模拟>模拟器>打开模拟窗口”功能区选项)。
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效果