如何将增强MSM与增强信号结合使用?
How to Use boost msm combined with boost signal?
我对"增强msm"真的很陌生,现在我遇到了一个问题,如何在增强msm中使用增强信号,我已经尝试了很多次,但没有工作。
我想要实现的是,当机器改变其状态时,动作操作员发出信号,我的外部实体捕获信号并继续其他功能,但现在我无法将信号发送到机器外,我无法将信号与外部实体连接。 有没有例子?
你可以组合使用Boost.Signals2和Boost.MSM。
下面是简单的 signals2 示例。
https://wandbox.org/permlink/XZzGIIVWXjvOPzdd(运行演示(
#include <iostream>
#include <string>
#include <boost/signals2/signal.hpp>
#include <iostream>
// begin -- signals2 code
struct signal_data {
int i;
std::string str;
};
struct sender {
boost::signals2::signal<void(signal_data const&)> foo;
void send() {
foo(signal_data {42, "ABC"} );
}
};
struct receiver_1 {
void on_foo(signal_data const& sd) {
std::cout << __PRETTY_FUNCTION__ << " " << sd.i << ", " << sd.str << std::endl;
}
};
struct receiver_2 {
void on_foo(signal_data const& sd) {
std::cout << __PRETTY_FUNCTION__ << " " << sd.i << ", " << sd.str << std::endl;
}
};
// end -- signals2 code
int main() {
// signals setup ----------------------------------------
// external entities
receiver_1 r1;
receiver_2 r2;
sender s;
// make connection
// using lambda expression
s.foo.connect(
[&] (signal_data const& param) {
r1.on_foo(param);
}
);
// or bind
s.foo.connect(std::bind(&receiver_2::on_foo, &r2, std::placeholders::_1));
s.send();
}
信号发送点s.send()
。如果我们能从MSM的行动中呼唤s.send()
,目标就会实现。
这是简单的 msm 示例。
https://wandbox.org/permlink/tnRSQ07anNe49GpO(运行演示(
#include <iostream>
#include <string>
#include <boost/msm/back/state_machine.hpp>
#include <boost/msm/front/state_machine_def.hpp>
#include <boost/msm/front/functor_row.hpp>
// begin -- msm code
namespace msm = boost::msm;
namespace msmf = boost::msm::front;
namespace mpl = boost::mpl;
// ----- Events
struct event1 {};
// ----- State machine
struct sm1_:msmf::state_machine_def<sm1_> {
// States
struct state1:msmf::state<> {};
// Set initial state
using initial_state = state1;
// Actions
struct action {
template <class Event, class Fsm, class SourceState, class TargetState>
void operator()(Event const&, Fsm&, SourceState&, TargetState&) const {
std::cout << "action()" << std::endl;
// want to call s.send() here
}
};
// Transition table
struct transition_table:mpl::vector<
// Start Event Next Action Guard
msmf::Row < state1, event1, msmf::none, action, msmf::none >
> {};
};
// Pick a back-end
using sm1 = msm::back::state_machine<sm1_>;
// end -- msm code
int main() {
sm1 s1;
s1.start();
std::cout << "Send event1" << std::endl;
s1.process_event(event1());
}
该操作定义如下:
struct action {
template <class Event, class Fsm, class SourceState, class TargetState>
void operator()(Event const&, Fsm&, SourceState&, TargetState&) const {
std::cout << "action()" << std::endl;
// want to call s.send() here
}
};
如何在行动中调用s.send()
?
首先,将发送方的引用添加为 sm1_ 的成员变量。
sender& s; // define sender reference as a member variable
然后,在构造函数中初始化它。
sm1_(sender& s):s(s) {} // initialize sender in constructor
然后,在创建状态机时传递包装std::ref
发送方。
sm1 s1(std::ref(s)); // pass sender as reference
最后,在操作中调用s.send()
。您可以通过Fsm
引用访问s
,如下所示:
struct action {
template <class Event, class Fsm, class SourceState, class TargetState>
void operator()(Event const&, Fsm& f, SourceState&, TargetState&) const {
std::cout << "action()" << std::endl;
f.s.send();
}
};
这是整个代码:
https://wandbox.org/permlink/gh83EW8eado5iOi8(运行演示(
#include <iostream>
#include <string>
#include <boost/signals2/signal.hpp>
#include <iostream>
#include <boost/msm/back/state_machine.hpp>
#include <boost/msm/front/state_machine_def.hpp>
#include <boost/msm/front/functor_row.hpp>
// begin -- signals2 code
struct signal_data {
int i;
std::string str;
};
struct sender {
boost::signals2::signal<void(signal_data const&)> foo;
void send() {
foo(signal_data {42, "ABC"} );
}
};
struct receiver_1 {
void on_foo(signal_data const& sd) {
std::cout << __PRETTY_FUNCTION__ << " " << sd.i << ", " << sd.str << std::endl;
}
};
struct receiver_2 {
void on_foo(signal_data const& sd) {
std::cout << __PRETTY_FUNCTION__ << " " << sd.i << ", " << sd.str << std::endl;
}
};
// end -- signals2 code
// begin -- msm code
namespace msm = boost::msm;
namespace msmf = boost::msm::front;
namespace mpl = boost::mpl;
// ----- Events
struct event1 {};
// ----- State machine
struct sm1_:msmf::state_machine_def<sm1_> {
sm1_(sender& s):s(s) {} // initialize sender in constructor
// States
struct state1:msmf::state<> {};
// Set initial state
using initial_state = state1;
// Actions
struct action {
template <class Event, class Fsm, class SourceState, class TargetState>
void operator()(Event const&, Fsm& f, SourceState&, TargetState&) const {
std::cout << "action()" << std::endl;
f.s.send();
}
};
// Transition table
struct transition_table:mpl::vector<
// Start Event Next Action Guard
msmf::Row < state1, event1, msmf::none, action, msmf::none >
> {};
sender& s; // define sender reference as a member variable
};
// Pick a back-end
using sm1 = msm::back::state_machine<sm1_>;
// end -- msm code
int main() {
// signals setup ----------------------------------------
// external entities
receiver_1 r1;
receiver_2 r2;
sender s;
// make connection
// using lambda expression
s.foo.connect(
[&] (signal_data const& param) {
r1.on_foo(param);
}
);
// or bind
s.foo.connect(std::bind(&receiver_2::on_foo, &r2, std::placeholders::_1));
// msm setup and process ---------------------------------
sm1 s1(std::ref(s)); // pass sender as reference
s1.start();
std::cout << "Send event1" << std::endl;
s1.process_event(event1());
}
相关文章:
- 多态性和功能结合
- 无法将结构注册为增强几何体3D点
- 增强基于 XML class_id的反序列化
- 将 Vulkan 与 SFML 结合使用?
- 增强精神解析器规则以检测语句中的特殊结尾
- C++ 使用增强正则表达式库时断言崩溃
- 增强精神 X3:错误:在"..."中没有名为"大小"的类型
- 如何包装(撰写)增强 hana 地图并访问括号运算符(运算符 [])?
- 将 c++ 生成器应用程序与外部 dll 结合使用
- 有没有办法在C ++中检测汉字?(使用增强)
- 如何将增强MSM与增强信号结合使用?
- MS Visual Studio 解决方案结合了非托管C++项目和 C# 项目
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- 如何使用增强::几何计算多边形的旋转固体体积?
- 复制部分文件的C++/增强方式
- 增强 ASIO 和串行端口异步读取
- 增强 Hana index_if和类型
- 增强超几何测试
- 如何修改增强 hana 结构的成员
- 查找到图中某一点一定距离内的所有线段=边,以及如何将增强图与增强几何体相结合