2015-07-13 46 views
0

我的問題更多的是一個架構問題。我有多個相同類型的狀態機。說將多個MSM Statemachines連接在一起

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()的線程需要知道它們工作的狀態機的類型。模板顯然...

編輯: 目標是解耦的實現。

回答

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。