前页 | 后页 |
示例:分叉和汇合
分叉伪状态分裂一个传入的转移
成两个或多个Transitions,终止于一个复合状态的正交区域中的Vertices。从分叉伪状态传出的转换不能有保护或触发器,并且各个传出转换的影响行为至少在概念上是同时执行的。
汇合函数合伪状态是来自不同正交区域中的顶点的两个或多个转换的公共目标顶点。汇合伪状态执行同步,因此所有传入的转换必须完成才能通过传出的转移
继续执行转移
.
在这个例子中,我们演示了具有分叉和汇合伪状态的状态机的行为。
建模状态机
状态机的上下文
- 创建一个名为MyClass的类元素,作为状态机的上下文
- 在浏览器窗口中右键单击MyClass并选择“添加|状态机”选项
状态机
- 在图中添加一个初始节点、一个分叉、一个名为State的状态、一个汇合和一个终点
- 放大State1 ,右键单击它 在图表上选择'高级|定义并发子状态 |定义'选项并定义RegionA和RegionB
- 在RegionA中,定义StateA1 ,转换到StateA2 ,由事件X触发
- 在RegionB中,定义StateB1 ,转换到StateB2 ,由事件Y触发
- 绘制其他转换:初始到分叉;分叉到划和StateB1 ; StateA2 和 StateB2到汇合;汇合到终点
仿真
工件
Enterprise Architect支持 C、C++、C#、 Java和JavaScript ;我们将在此示例中使用JavaScript ,因为我们不需要安装编译器(对于其他语言,需要 Visual Studio 或 JDK)。
- 从图表中选择“工具箱仿真页面,然后将绘图工具拖到可执行状态机上,创建一个工件;将其命名为ForkNJoinSimulation并将其“语言”字段设置为“ JavaScript ”
- 从浏览器窗口 Ctrl+ 将MyClass拖放到属性ForkNJoinSimulation D工件;将其命名为myClass
代码生成
- 单击ForkNJoinSimulation并选择“仿真> 可执行状态 > 状态机 >生成、编译和运行”功能区选项
- 为生成的源代码指定目录
运行仿真
当仿真开始时, State1 、 StateA1和StateB1处于活动状态,状态机正在等待事件。
选择“仿真>动态仿真>事件”功能区选项,显示仿真事件窗口。
简单来说,在事件X中,触发器会退出并进入StateA2 ;在 entry 和 doActivity 行为运行后,运行的完成事件被调度和回调。然后启用并遍历从StateA2到汇合伪状态的转换。
注记:汇合必须等待所有传入的转换完成,然后才能通过传出的转移
继续执行转移
.由于RegionB的分支没有完成(因为StateB1仍然处于活动状态,等待触发),此时不会执行从汇合终端到终点的转换。
简单来说,在事件Y时,触发器将退出并进入StateB2 ;在 entry 和 doActivity 行为运行后,运行的完成事件被调度和回调。然后启用并遍历从StateB2到汇合伪状态的转换。满足所有传入的过渡都已完成的条件,则执行从汇合到汇合终点的过渡。仿真结束。
提示:您可以从仿真窗口('仿真>动态仿真仿真>模拟器>打开仿真窗口'功能区选项)查看执行轨迹序列。
myClass[MyClass].Initial_82285__TO__fork_82286_82286_61745影响
myClass[MyClass].StateMachine_State1 条目
myClass[MyClass].StateMachine_State1 DO
myClass[MyClass]影响
myClass[MyClass].StateMachine_State1_StateA1 条目
myClass[MyClass].StateMachine_State1_StateA1 DO
myClass[MyClass]影响
myClass[MyClass].StateMachine_State1_StateB1 条目
myClass[MyClass].StateMachine_State1_StateB1 DO
触发器X
myClass[MyClass].StateMachine_State1_StateA1 退出
myClass[MyClass]影响
myClass[MyClass].StateMachine_State1_StateA2 条目
myClass[MyClass].StateMachine_State1_StateA2 DO
myClass[MyClass].StateMachine_State1_StateA2 退出
myClass[MyClass]影响
触发器
myClass[MyClass].StateMachine_State1_StateB1 退出
myClass[MyClass]影响
myClass[MyClass].StateMachine_State1_StateB2 条目
myClass[MyClass].StateMachine_State1_StateB2 DO
myClass[MyClass].StateMachine_State1_StateB2 退出
myClass[MyClass]影响
myClass[MyClass].StateMachine_State1 退出
myClass[MyClass]影响