【问题标题】:UML State machine with nested states and do Activity具有嵌套状态的 UML 状态机并执行 Activity
【发布时间】:2016-02-20 03:50:20
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 点击图片查看大图。

标签: uml statechart


【解决方案1】:

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

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

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

在您的情况下,StateH 处于活动状态,而 StateG 处于活动状态(参见活动状态配置的定义),因此,StateH 的 doActivity 在您处于 StateG 时保持运行

【讨论】:

  • 你的解释是对的。然而这种行为非常麻烦:这意味着 do 活动必须在单独的线程上运行,与为其余信号提供服务的线程分离......
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    相关资源
    最近更新 更多