问题标签 [boost-statechart]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
465 浏览

c++ - 对在 Boost.statechart 中完成的所有正交状态做出反应

我正在研究基于状态机的机器人控制程序。虽然该程序使用 Qt 状态机框架,但我也尝试使用 Boost.statechart (BS) 作为理论练习和学习/评估库的一种方式来实现它。

在 Qt 版本中,我在几个地方使用了以下模式:复合状态具有并行嵌套的子图,每个子图最终都会达到最终状态。当所有并行子状态完成时,父状态发出“finished()”信号,这导致机器转换到下一个顶级状态。例如(当心:伪图):

calibrate_*状态又在其中具有嵌套状态,例如最终状态S -trigger[calibrated?]-> F在哪里。F当两个calibrate_*状态都达到它们各自的F状态时finished,信号使状态机转变为Idle.

Qt 的并行子状态类似于 BS 的正交嵌套状态。起初我认为“终止”是 BS 对最终状态的类比,但实际上并非如此。它更像是“终止状态机,除非还有一些正交的东西在某处”——一旦你终止所有正交状态,父状态也会终止,没有任何转移的机会。在终止时发布事件也无济于事,因为没有可以将这些事件传递到的状态。

我最终实现了“最终状态”,它在到达时发布通知事件并在父状态中对此事件做出反应 - 检查所有正交状态是否已达到其最终事件并在那时过渡。这基本上是 Qt 状态机方法的重新实现,但是每次我需要这种模式时都必须重做。但也许我只是习惯了一种实现这种效果的方法,以至于我看不到替代方法吗?

0 投票
1 回答
1467 浏览

c++ - 在 Boost.Statechart 中,state 和 simple_state 有什么区别?

在使用 Boost.Statechart 实现状态机时,我遇到了一个问题,原因是尝试simple_state从其构造函数访问 a 的外部上下文。中的一条评论simple_state.hpp告诉我:

除了显然能够从其构造函数访问外部上下文之外,使用state<>而不是simple_state<>作为我的状态的基类有什么区别或影响?

0 投票
2 回答
3303 浏览

c++ - 使用转换提升状态图传递参数

我正在尝试学习 boost::statechart。

我想制作一个加载文件的小应用程序。

但是我如何将参数传输到状态,例如文件名?如果我将文件名存储在 EvLoad 中,我可以轻松访问它以进行状态反应

但是当我处于 Unloaded 状态时,我正在调用 Loaded 的构造函数,我无法将参数传递给它。我想出的唯一解决方法是在转换之前重新发布事件,但这对我来说看起来有点脏。

有更好的选择吗?

0 投票
1 回答
2344 浏览

c++ - 如何在 boost::statechart state_machine 对象中获取当前最衍生的状态?

我正在使用 boost::state_chart 库。出于调试目的,我想在任何给定时间知道我的状态机的状态。如何在 state_machine 对象中获取当前(最衍生的)状态?

0 投票
1 回答
2115 浏览

c++ - 使用 Boost 状态图,如何无条件转换到状态?

一旦构造函数完成,我有一个状态A,我想B无条件地转换到下​​一个状态A。这可能吗?

我尝试从构造函数发布一个事件,即使它编译,它也不起作用。谢谢。

编辑:这是我迄今为止尝试过的:

这会产生以下运行时断言失败:

0 投票
1 回答
350 浏览

c++ - 继承反应

我想定义一个派生自 的基类,statechart::simple_state它具有“预定义”反应,这些反应本身称为虚函数(必须在派生类中实现)。我想要的是,如果某些状态从我的基类派生,它们会自动对某些事件做出反应。

像这样(scboost::statechart):

然后,在派生类中:

派生类中的typedef将“覆盖”我假设的基类中的那个,所以也许我还需要将custon_reaction心跳事件定义为派生类中的列表。但也许这个设计不像这个图书馆的设计师认为的那样,谁能帮我解决这个问题?

编辑

与此同时,我获得了一些额外的知识。一种解决方法是typedef在派生类而不是基类中定义它。但是,出现了一个奇怪的问题:编译器将找不到一个方法,react (const EvHeartBeat& )尽管它是在基类中定义的,但如果我删除其他反应(react (const OtherEvent& ))它可以工作。但这当然不是我想要的,我希望能够对多个事件做出反应。

0 投票
1 回答
1364 浏览

c++ - 如何在 Boost::Statechart 中为一个状态添加 20 多个转换?

我不得不承认我对 C++ 和 Boost Statecharts 还很陌生。我玩了一下 Statechart 库,想构建一些“更大”的状态机。

我举了一个非常简单的例子来说明我的问题。让我们假设一个状态机只有一个状态和很多自转换。如何构建这样的东西?gcc(4.5.2) 编译器拒绝超过 20 个转换的所有内容(“模板参数的数量错误(21,应该是 20)”)

这是一些示例代码:

0 投票
2 回答
2232 浏览

c++ - Boost Statechart - 局部转换

我希望有人可以帮助我解决这个问题,或者至少指出我的方式的错误......

作为我的问题的简单说明,请考虑应用程序的一部分,您可以在其中进入“功能模式”操作状态。然后根据用户按下的功能键 F1-F4 可以使用四种子模式。默认进入 F1 模式。状态图开始如下:

图1

用户可以随时按F1-F4切换到相应的模式。将这些转换添加到内部状态会导致以下结果:

图 2

显然,这是(a)一团糟,(b)需要定义很多转换。如果在某个时候我想添加一个 F5Mode 那么......好吧,你明白了。为避免这种情况,我想做以下事情:

图 3

Boost Statechart 允许我定义从 FunctionMode 到任何内部状态的转换,但结果不是我所期望的。实际结果如下:

图4

即按 F1-F4 切换模式会导致外部 FunctionMode 状态退出并重新进入,同时触发不需要的退出和进入动作。

早在 2006 年,图书馆作者和用户之间的这个线程似乎描述了同样的问题。我认为作者建议执行以下操作作为解决方法:

图 5

然而,这种变通方法对我来说似乎不是很吸引人:它添加了一个额外的状态级别来编译,代码变得不那么可读了,必须使用深度历史来返回任何功能模式 sub -states 和中间状态对象被不必要地再次破坏和构造。

所以......我哪里错了?或者有什么替代方案?我已经简要了解了 Boost Meta State Machine (msm),但从我目前所见的情况来看,我更喜欢 Statechart 的外观。

我很惊讶更多的用户没有遇到同样的问题......这让我觉得也许我的方法是完全错误的!

0 投票
1 回答
421 浏览

boost - Boost状态图,不同FSM之间的通信

假设我创建了几个从状态图继承的独立 FSM 类。然后,我实例化这些对象,我希望它们能够相互触发事件;例如,第一个 FSM 将进入“ON”状态并在第二个 FSM 中触发一个事件(如 process_event(EvSomething()) )。

最好的方法是什么?

非常感谢,

法布里齐奥

0 投票
0 回答
395 浏览

c++ - 提升状态图,状态机的单元测试部分

我正在寻找一种方法来执行(出于单元测试目的)仅复杂状态机的一部分。为此,我正在评估 boost::statechart 框架。

我考虑的一种方法是设计一个分层状态机,其中每个状态都定义为嵌套状态机,应该单独测试。

考虑以下代码片段中的 FSM 定义:

是否可以对状态 B 内部定义的逻辑进行单元测试,即 B1 和 B2 内部状态,而不执行甚至编译为状态 A 定义的逻辑,包括其内部 A1 和 A2 状态?

提前致谢, AmirH