4

在下面的状态机上,假设我在“StateE”。然后是 Sig1,因此发生了转换。首先我退出“StateE”,然后假设“Grd1”守卫让我通过。

现在我进入“StateH”,执行进入动作(“Act2”)。然后我将一个信号放入队列中以执行“StateH”的“do”动作。这意味着“StateH”“do”操作不必在 enter 操作之后立即执行,但可能会首先提供一些其他已调度的信号。

然后我进入“StateG”。再次在“StateG”中,执行进入动作(“Act2”)并且“do”动作被调度为信号。

信号调度程序到达信号队列中 StateH 执行动作信号所在的点。

问题是:我们是在执行StateH的do动作之前从StateG退出回到StateH还是可以说:处于StateG也处于StateH,所以不需要状态转换,让我们立即执行StateH的do动作。

在此处输入图像描述

4

2 回答 2

3

根据UML 规范(formal-15-03-01, Sect. 14.2.3.4.3)

一个状态也可能有一个关联的 doActivity 行为。此行为在进入状态时开始执行(但仅在状态进入行为完成后)并与可能与状态相关的任何其他行为同时执行,直到: • 它完成(在这种情况下会生成完成事件)或 • 退出状态,在这种情况下,doActivity 行为的执行被中止。

这意味着 1) doActivity 在进入状态后立即执行(与您的理解相反)和 2) doActivity 在状态处于活动状态时继续运行。

在您的情况下,处于活动状态StateHStateG处于活动状态(请参阅活动状态配置的定义),因此,doActivityStateH在您处于活动状态时会继续运行StateG

于 2015-11-18T15:34:48.407 回答
0

OMG Unified Modeling Language 2.5.1中,这句话要强一些:

此外,如果为 State 定义了 doActivity Behavior,则在执行 entry Behavior 后,此 Behavior 将立即开始执行。它与与进入状态相关的任何后续行为同时执行,例如作为同一复合转换的一部分输入的子状态的进入行为。

我不相信这意味着状态机必须是多线程的。假设您在单核处理器上有一个多线程状态机。各种行为和活动仍将按顺序执行,尽管它们可能由单独的线程执行。

于 2018-10-28T22:27:18.777 回答