Я довольно новичок в C ++ и Qt и хочу разработать систему управления машиной и моделировать процесс с помощью конечных автоматов.До сих пор я разделял свой код на разные объекты QObject, работающие в разных QThreads, которые взаимодействуют через концепцию сигнал / слот QT.До сих пор я использовал QStatemachine Framework, но подозрительно, если я использую его правильно.В качестве примера я создал простой StateMachine:
*. H:
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
функций этого boost :: msm?