【问题标题】:How do you create a state machine within a state?如何在一个状态中创建状态机?
【发布时间】:2018-04-10 06:21:47
【问题描述】:

我想要一个包含不太多状态的顶级状态图。因此,通常(即在纯 C++ 中)每个状态本身都可以是状态机。我如何在 Rhapsody 中做到这一点?

例如:我有状态图:

*--> init --> do_stuff --> finished

当它进入 do_stuff 状态时,我希望它下拉到 do_stuff_statechart(我猜这只是另一个带有状态图的普通类):

*--> read_config --> check_config --> init_reconfig --> doing_config --> exit
          ^               |
          |               |
          +---------------+

当子状态图到达exit它应该回到顶层状态图并进入完成状态...

我真的不知道该怎么做。我的意思是我可以将一个事件调用到另一个状态图中并等待它响应 - 但是将 do_stuff 状态链接到do_stuff_statechart?

有这方面的例子吗?或者是否有一个“模式”可以遵循?

【问题讨论】:

    标签: c++ state-machine rhapsody


    【解决方案1】:

    在 Rhapsody 中,当您右键单击状态图中的某个状态时,您应该会在上下文菜单中看到一个名为“创建子状态图”的选项。

    这就是你要找的吗?

    【讨论】:

    • 啊....就在那里!,是的,这正是我正在寻找的 - 感谢 Shlomo :) ...我开始认为缺少该功能 - 教程/我可以在网上找到的文档根本没有解释子状态图:(
    【解决方案2】:

    好吧,如果您需要一个状态机来处理状态机中的状态,您有两种选择:

    1. 在返回到主状态机管理器之前强制从属状态机运行完成。
      这完全抽象了您从主状态机使用从属状态机这一事实,但会降低透明度,可能需要更多资源,并且可能会影响可中断性。

    2. 向状态机添加一些额外的状态,主状态机将其处理为不透明状态,但从属状态机将使用它来处理自身。
      您仍然必须将节点划分为设置、运行和拆卸。除此之外,它需要更多的调度才能到达正确的子状态处理程序。

    3. 通过将主状态机中的节点替换为从状态机的所有节点来扁平化状态空间。
      唯一的缺点是从属状态机与剩下的主状态机基本上没有绝缘。

    现在,由您决定最适合您的用例的方案。

    【讨论】:

    • 好的,所以如果我理解正确 1. 就像我建议的那样(只需让顶级状态机将事件调用到子状态机中以启动它,然后等待来自子的事件-statemachine 继续...)。我真的不明白第 2/3 点......它似乎是在说(简而言之)在顶层添加额外的状态?
    • @code_fodder 不完全是。它不是等待一个事件,而是等待该节点的处理结束,无论这需要什么,就像任何其他节点一样。是的,2 和 3 意味着更多的顶级节点,无论是用于管理从属状态机,还是完全吸收它。
    • 我不太确定处理节点是什么——这是 Rhapsody 的东西吗? - 但正如你所说,我认为选项 1 对我来说会比 2/3 更好。我仍然不明白您如何在狂想曲导航方面将顶级状态机与子状态机联系起来......我将不得不查找处理节点术语:)
    • 状态机是状态(节点)和转换(边)的网络。两者都可能与某些处理相关联,并且转换可能还需要一个事件(信号)才能触发。
    • 啊酷 - 感谢翻译!,我正在使用 Rhapsody 术语“状态”、“转换”和“事件”。 +1 的帮助虽然 shlomo 的回答对我来说是一针见血
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 2012-06-19
    • 2018-01-02
    • 2013-01-25
    • 2021-09-13
    • 1970-01-01
    相关资源
    最近更新 更多