gpt4 book ai didi

Qt 5.8 如何使用带有子状态机的 SCXML 框架?

转载 作者:行者123 更新时间:2023-12-04 18:33:53 25 4
gpt4 key购买 nike

我正在尝试构建一个系统,该系统由主状态机编排,并针对正在执行的任务具有不同的子状态机。作为一个长期使用 Qt 的用户,我查看了 Qt 5.8 中新的 SCXML 实现。但是我无法弄清楚如何使用 5.8 提供的 API 来正确实现子状态机。

我的想法是使用一个主状态机,然后在主状态机的状态下调用特定的子状态机。在调用子状态机工作时,我无法弄清楚在顶级状态机对象发出 invokedServicesChanged(..) 后如何访问它们我可以访问指向 QScxmlInvokableService 的指针但不是相关的状态机。

此外,顶级状态机对象仅从顶部公开状态和事件,而不是从调用的状态机公开。例如 topLevelStateMachine->activeStateNames()只列出顶级状态。

查看 Qt 的源代码,我看到了 QScxmlInvokableService实际上是 QScxmlScxmlService 的基类其中包含指向相关状态机的指针。不幸的是 QScxmlScxmlServiceqscxmlinvokableservice_p.h 中定义它是私有(private)的 _p名称中表示。那么我应该如何使用公共(public) SCXML API?我错过了什么吗? IIRC SCXML 支持是 5.7 中的技术预览,但现在作为正常分布的一部分包含在 5.8 中。

最佳答案

我花了大约一周的时间研究这些示例,然后编写我自己的状态机和响应它的代码。由于文档不够清晰,因此花了一段时间。

我发现 activeStateNames确实检索状态机中包含的所有状态,包括子状态。

我花了几次阅读 traffic light example弄清楚这一点。关键是子状态机包含在特定状态中。 (状态机的图形 View 在这里有所帮助。)

在该示例中,整个顶级机器中只有两个状态:workingbroken .转换由事件控制 smashrepair .

在这两个状态中的每一个中都有较小的状态机。 Broken 包含两个状态的状态机:blinkingunblinking .该状态机以状态 blinking 启动当broken被输入。

当处于子状态blinkingbroken , activeStateNames 将返回 blinking如果用 false 调用(默认)或 blinkingbroken当使用 true 调用时.

那么你如何使用它呢?

如果我有一些我想根据特定状态设置/取消设置的东西,我可以 connectToState在机器中。当状态在事件和非事件之间变化时,我连接的插槽将被调用,它会收到一个 bool 值,说明状态是否处于事件状态。在交通灯示例中,状态 red连接到 redLight .由于redLightred 中时应打开状态而不是其他情况,它连接到一个插槽,需要一个 bool 值:true打开灯,false将其关闭。

好的,但是如果我想在进入状态时捕捉事件怎么办?

我只需选择状态,然后添加一个 onEntry -> send 并指定事件名称。当我进入该状态时,这将导致发送一个事件。可以使用 connectToEvent 将此事件路由到插槽(在 Qt 5.8 中) . [Qt 5.7 版本只有一个通用的eventOccurred可以发送到插槽的信号,然后使用 event.name() 查询哪个事件。]

关于Qt 5.8 如何使用带有子状态机的 SCXML 框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41959423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com