0

我对 C++ 和 Qt 很陌生,我想开发一种机器控制并通过状态机对过程进行建模。到目前为止,我将我的代码分成不同的 QObjects,这些 QObjects 在不同的 QThreads 中运行,它们通过 QTs 信号/插槽概念进行通信。到目前为止,我一直在使用 QStatemachine 框架,但我怀疑我是否以正确的方式使用它。例如,我创建了一个简单的 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 框架进行了一些研究,并且喜欢提供的语法和功能(转换表、“无”事件等)。是否有适当的方法将 boost::msm 嵌入 QObject 并能够在on_entryboost::msm 的函数中发出该 QObject 的信号?
4

0 回答 0