- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题更像是一个架构问题。我有多个相同类型的状态机。说
controller_type1_sm controller1;
controller_type2_sm controller2;
std::array<worker1_sm,10> workers1;
std::array<worker2_sm,10> workers2;
现在,当一个 Controller 发送消息时,我是否应该使用调度程序将名称或 ID 调度到队列,该队列由在指定的 msm 上调用 process_event()
的线程工作?
当事件从公共(public)基础派生时,它们可以保存在通用队列中,但 process_event()
需要知道它是什么类型的事件。访客类 dispatch 他们?有更好的解决方案吗?
当我将事件限制为仅数字 ID 时,我可以消除很多问题,但另一方面,MSM 需要类型而不是 ID。
调用 process_event()
的线程需要知道它们工作的状态机的类型。模板显然......
编辑:目标是分离实现。
最佳答案
事实上,它归结为如何将不同的消息放入队列中并在没有知道所有事件的访问者的情况下将它们取回。
#include <queue>
#include <iostream>
struct runtime
{
template <class T>
void accept(const T& evt)
{
std::cout << "Accept: " << typeid(evt).name() << std::endl;
// fsm.process_evt(evt);
}
};
struct action
{
virtual void operator()(runtime& rt) = 0;
};
template <class T>
struct carrier : action
{
virtual void operator()(runtime& rt)
{
rt.accept(T());
}
};
struct ev_test {};
int main(int argc, char** argv)
{
using queue_t = std::deque<action*>;
queue_t q;
// capsulue the two functions
runtime rt;
carrier<int> f1;
carrier<ev_test> f2;
q.push_back(&f1);
q.push_back(&f2);
while (q.size())
{
auto& c = q.front();
(*c)(rt);
q.pop_front();
}
}
在此示例中,“运行时”包含我的 FSM。
关于c++ - 将多个 MSM 状态机耦合在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31380451/
假设我有 2 个状态,一个事件状态和一个空闲状态。如果我在 Active 状态下收到一些事件,我想推迟它们并在我返回 Idle 状态时执行它们。 但是当我回到空闲状态时,有没有办法选择要处理哪个先前延
我有一个像这样的状态机: class FsmDef : public boost::msm::front::state_machine_def { private: Args args;
我是 boost 元状态库的新手。我正在构建一个应用程序,我必须在其中使用 msm。 我的应用程序有两个线程,它们使用相同的 msm 对象作为共享资源。如果两个线程都在同一个 msm 对象上调用 pr
我有一个实时循环,我需要根据我所处的状态进行每次迭代的工作。 我正在使用 Boosts Meta State Machine 库来实现我的状态机。根据我所处的状态调用函数的最佳方法是什么? 假设我有一
我想知道是否有一种方法可以直接安装msm而不需要创建另一个安装项目? 最佳答案 这是不可能的。 MSM 包的目的是共享资源,例如 VC++ 可再发行组件,您可以将其包含在应用程序的安装程序中,例如先决
我有一个更大的站点,它使用 MSM 分成子域。这些站点中的每一个都有自己的一组员工来管理该部分。我的想法是创建成员组来反射(reflect)这些员工组,并为他们分配对每个子域的适当访问权限。每个子域都
我尝试使用 boost::MSM 实现一个简单的状态机以进行测试。有几个事件必须按正确的顺序处理,所以我推迟了目前不允许的其他事件。我尝试推迟转换表中的事件,以便在一个地方寻找它,尽管要查看所有状态,
在 boost::msm 的文档中有一个 example没有默认构造函数的状态机。我可以让它在我直接从 super SM 跳到子 SM 的地方工作。但是当我从一个子 SM 跳转到另一个子 SM 时,目
我的问题更像是一个架构问题。我有多个相同类型的状态机。说 controller_type1_sm controller1; controller_type2_sm controller2; std::
我有一个通用的保护条件,我想在某些情况下有条件地阻止转换。下面是我想做的一些 C++/伪代码。 bool operator()(Event const& evt, FSM & fsm, SourceS
我在使用 boost::msm 实现子子状态机时遇到了一些麻烦。我试图在这里最小化我的代码... 测试.cpp: struct SM_ : StateMachineA {}; // Pick a ba
以下代码是仿函数前端的 boost msm 文档中给出的示例。 #include #include // back-end #include //front-end #include //
网络上的任何地方似乎都没有关于如何执行此操作的分步过程记录。如果提到它,它的文档记录很差,我无法遵循他们建议的复杂路径。我是 ClickOnce 的新手,我已经能够让我的 c# 程序在用户机器上正确安
我想使用 boost msm 状态机,但我很难想象它是如何工作的。假设我们只有 2 个状态(s1,s2),要从 s1 到 s2,您需要触发事件 e1 并返回,您需要另一个 e2。e1 和 e2 只能分
我正在使用新的 Boost 1.44.0 MSM 库来生成状态机。在此状态机中,有两类事件 class1 和 class2。 class1 事件可以由状态 S1 或 S2 处理,而 class2 事件
当我触发 process_event("eventname") 时,如何检查状态转换是否发生或是否调用了 no_transition? 基本上,我希望触发/调用 process_event("even
我使用 MSM 插件在两个不同的域名上运行两个 ExpressionEngine 站点。站点一包含所有系统文件等,站点二位于站点一的子文件夹中。我的问题是如何让站点 2 在 url 中没有它的 ind
我正在使用 Windows Installer XML (WiX) 工具集创建发行版。我想将 Visual C++ Redistributable 添加到包中。这里 http://wix.source
我正在熟悉 MSM boost 库。我发现这真的很有趣 questions关于加入几个正交状态。 此外,我在 boost 文档中找到了一种在父状态机中重用子状态机的方法,并且我编写了几个简单的嵌套状态
我正在使用 Boost MSM 来模拟机器人的行为。有多种状态,如“ManualMove”、“AutoMove”、“Work”、“Idle”等……但是,我需要能够从任何状态强行停止机器人,将其置于无法
我是一名优秀的程序员,十分优秀!