【问题标题】:Coupling multiple MSM Statemachines together将多个 MSM 状态机耦合在一起
【发布时间】:2015-07-13 10:04:25
【问题描述】:

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

controller_type1_sm controller1;
controller_type2_sm controller2;

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

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

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

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

编辑: 目标是解耦实现。

【问题讨论】:

    标签: c++ multithreading c++11 boost boost-msm


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 2017-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多