QStateMachine автоматические переходы или смешивание boost::msm с QObject
Я довольно новичок в C++ и Qt и хочу разработать систему управления машиной и моделировать процесс с помощью конечных автоматов. До сих пор я разделял свой код на разные объекты QObject, работающие в разных QThreads, которые взаимодействуют через концепцию сигнал / слот QT. До сих пор я использовал QStatemachine Framework, но подозрительно, если я использую его правильно. В качестве примера я создал простой StateMachine:
*.час:
class SmTest : public QStateMachine
{
Q_OBJECT
public:
explicit SmTest(QObject *parent = nullptr);
private:
QState* sA;
QState* sB;
QState* sC;
QState* sD;
signals:
void DoSomethingA();
void DoSomethingB();
void DoSomethingC();
public slots:
void onA();
void onB();
void onC();
void onD();
public slots:
};
*.Cpp:
SmTest::SmTest(QObject *parent) : QStateMachine(parent)
{
sA = new QState(this);
sB = new QState(this);
sC = new QState(this);
sD = new QState(this);
connect(sA, &QState::entered, this, &SmTest::onA);
connect(sB, &QState::entered, this, &SmTest::onB);
connect(sC, &QState::entered, this, &SmTest::onC);
connect(sD, &QState::entered, this, &SmTest::onD);
sA->addTransition(this, &SmTest::DoSomethingA, sB);
sB->addTransition(this, &SmTest::DoSomethingB, sC);
sC->addTransition(this, &SmTest::DoSomethingC, sD);
this->setInitialState(sA);
}
void SmTest::onA()
{
qDebug() << "onA entered";
emit DoSomethingA();
}
void SmTest::onB()
{
qDebug() << "onB entered";
double rnd = qrand() % 2;
if (rnd > 1)
emit DoSomethingB();
}
void SmTest::onC()
{
qDebug() << "onC entered";
emit DoSomethingC();
}
void SmTest::onD()
{
qDebug() << "onD entered";
}
В этом случае я должен объявить сигнал для каждого перехода и слот для каждого состояния в моем FSM и подключить их соответственно. Это может быть хорошо в небольших примерах, таких как приведенные выше, но будет довольно быстро, если FSM может содержать>100 состояний.
- Есть ли способ использовать безусловные переходы? Например
sA->addTransition(sB)
будет означать, что sA автоматически перейдет в sB. Однако, если я попытаюсь использовать это, это сломает мой QStateMachine. Если это невозможно: - Я немного заглянул в Boost MSM Framework и мне понравился синтаксис и функциональность, если есть предложения (таблица переходов, "Нет"- событие и т. Д.). Есть ли правильный способ встроить boost::msm внутри QObject и иметь возможность испускать сигналы этого QObject внутри
on_entry
функции этого повышения:: MSM?