QStateMachine автоматические переходы или смешивание boost :: msm с QObject - PullRequest
0 голосов
/ 10 октября 2018

Я довольно новичок в 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 состояний.

  1. Есть ли способ использовать безусловные переходы?Например, sA->addTransition(sB) будет означать, что sA автоматически перейдет в sB.Однако, если я попытаюсь использовать это, это сломает мой QStateMachine.Если это невозможно:
  2. Я немного посмотрел на Boost MSM Framework и мне понравился синтаксис и функциональность, если он предлагает (таблица переходов, «Нет» - событие и т. Д.).Есть ли правильный способ встроить boost :: msm в QObject и иметь возможность испускать сигналы этого QObject внутри on_entry функций этого boost :: msm?
...