Соединение нескольких MSM Statemachines вместе

Мой вопрос больше архитектурный вопрос. У меня есть несколько государственных машин одного типа. Сказать

controller_type1_sm controller1;
controller_type2_sm controller2;

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

Теперь, когда один контроллер отправляет сообщения, я должен использовать диспетчер, который отправляет имя или идентификатор в очередь, которая обрабатывается потоком, который вызывает process_event() на указанном мсм?

События могут храниться в общей очереди, когда они получены из общей базы, но process_event() нужно знать, что это за событие. Посетитель класса, чтобы отправить их? Есть лучшее решение?
Когда я ограничиваю события только числовыми идентификаторами, я могу устранить множество проблем, но с другой стороны, МСМ нужны типы, а не идентификаторы.

Нити, которые вызывают process_event()Необходимо знать тип конечного автомата, на котором они работают. Шаблон очевидно …

РЕДАКТИРОВАТЬ:
Цель состоит в том, чтобы отделить реализации.

0

Решение

Фактически, это сводилось к тому, как поставить в очередь различные сообщения в очереди и вернуть их обратно без посетителя, который знает все события.

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

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector