0

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

controller_type1_sm controller1;
controller_type2_sm controller2;

std::array<worker1_sm,10> workers1;
std::array<worker2_sm,10> workers2;

现在,当一个控制器发送消息时,我是否应该使用一个调度程序将名称或 ID 调度到一个队列,该队列由调用process_event()指定 msm 的线程工作?

当事件从一个公共基础派生时,它们可以保存在一个通用队列中,但process_event()需要知道它是什么类型的事件。访客班来派遣他们?有更好的解决方案吗?
当我将事件限制为数字 ID 时,我可以消除很多问题,但另一方面,MSM 需要类型而不是 ID。

调用 , 的线程process_event()需要知道它们工作的状态机的类型。模板显然...

编辑:目标是解耦实现。

4

1 回答 1

1

事实上,它归结为如何在队列中排队不同的消息并在没有知道所有事件的访问者的情况下将它们取回。

#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。

于 2015-07-20T12:42:46.037 回答