gpt4 book ai didi

c++ - Boost MSM 仅处理内部转换

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:32:06 27 4
gpt4 key购买 nike

我正在使用新的 Boost 1.44.0 MSM 库来生成状态机。在此状态机中,有两类事件 class1class2class1 事件可以由状态 S1S2 处理,而 class2 事件只能由状态 处理>S2

特殊的 class1 事件 upgrade_req 请求从状态 S1 升级到状态 S2

我在 Boost::MSM 中实现了如下:

// State S1 and S2 allow any class1 events
struct class1 {};
// Only state S2 allows class2 events
struct class2 {};

// an upgrade request is a class1 event that requests an upgrade to state 2
struct upgrade_req : public class1 {};

struct MyFSM : public msm::front::state_machine_def< MyFSM >
{
/// State 1. Allows any class1 event
struct S1 : public msm::front::state<>
{
/// functor says "processing event in State 1"
struct ProcessEvent { /* ... */ };

struct internal_transition_table : mpl::vector<
// Event Action Guard
// +-------+-------------+------------+
Internal< class1, ProcessEvent, none >
> {};
}; // S1

/// State 2. Allows any class1 or class2 events
struct S2 : public msm::front::state<>
{
/// functor says "processing event in State 2"
struct ProcessEvent { /* ... */ };

struct internal_transition_table : mpl::vector<
// Event Action Guard
// +-------+-------------+------------+
Internal< class1, ProcessEvent, none >,
Internal< class2, ProcessEvent, none >
> {};
}; // S2

/// everybody starts in state 1
typedef S1 initial_state;

/// send an error if a class2 event was received for state1
struct SendError { /* ... */ };

/// Send a response to the upgrade request
struct SendUpgradeRsp { /* ... */ };

/// functor returns true if the request to upgrade to state 2 is OK.
struct VerifyUpgradeReq { /* ... */ };

struct transition_table : mpl::vector<
// Start Event Next Action Guard
// +------+-------------+------+----------------+------------------+
Row< S1, class1, none, none, none,
Row< S1, class2, S1, SendError, none >,
Row< S1, upgrade_req, S2, SendUpgradRsp, VerifyUpgradeReq >,

Row< S2, class1, none, none, none,
Row< S2, class2, none, none, none >
> {};
}; // MyFSM

我的问题是,当我按原样使用它时,upgrade_req 事件永远不会被主 MyFSM::transition_table 处理。它仅由 S1::internal_transition_table 处理。

例如:

int main( int argc, char* argv[] )
{
msm::back::state_machine< MyFSM > sm;
sm.start();
sm.process_event( class1() );
sm.process_event( upgrade_req() );
sm.process_event( class2() );
return 0;
}

我希望它的输出是:

processing event in State 1.
Upgrade Request OK.
processing event in State 2.

但是,我得到的是:

processing event in State 1.
processing event in State 1.
Error. Received class 2 event in State 1.

有人对我如何解决这个问题有什么建议吗?

谢谢,保罗H

最佳答案

您的问题是内部转换的优先级高于转换表中定义的优先级。 update_req 是 class1,内部转换触发。这其实是符合UML标准的。MSM 为您提供了第二种解决方案,您可以在 transition_table 中使用一个没有作为目标的 Row 来定义 S1 的内部转换,而不是使用 internal_transition_table。如果在转换 S1 + upgrade_reg -> S2 之前定义它,它将具有较小的优先级,并且仅在无法考虑另一个时才会尝试。

如果您绝对需要一个 internal_transition_table,那么如果它不是 update_req,您只能提供一个守卫来拒绝 class1。

喂,克里斯托夫·亨利

PS:我是运气好才找到这篇文章的。发布到 boost 用户列表将保证您更快得到答案。

关于c++ - Boost MSM 仅处理内部转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3936019/

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