gpt4 book ai didi

c++ - 将多个 MSM 状态机耦合在一起

转载 作者:行者123 更新时间:2023-11-28 06:10:24 26 4
gpt4 key购买 nike

我的问题更像是一个架构问题。我有多个相同类型的状态机。说

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/

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