4

我对带有 ParallelState 的 QStateMachine 快疯了。我有一个包含第一个状态的主状态(顺序),一个包含一组并行状态的第二个状态,以及另一个再次顺序的状态。第一个状态表示创建 N 个输入文件的进程,第二个表示在每个输入上工作的 N 个线程(一个文件一个线程),最后一个状态表示一个生成整个进程报告的进程(需要等待第二个状态已完全结束)。好吧,问题就在我需要在第二个状态和第三个状态之间创建一个障碍的时候。我需要一些障碍才能完成所有线程,但我无法做到。在文档之后,据说复合状态是并行的,当其所有子级进入最终状态时调用完成。首先,在这种情况下,进入最终状态是什么意思?我是否需要为并行状态中的每个状态创建最终状态?无论如何,我尝试这个但没有。结果是当第一个线程完成时,我的容器的最终状态被调用。

这是一个片段:

QState *mainState = new QState(QState::ExclusiveStates);

// Create the first state associated to the first process
QState *firstState = new QState(mainState);
QObject::connect(firstState, SIGNAL(entered()), this, SLOT(executeFirstProcess()));

// parallel container state
QState *parallelContainerState = new QState(QState::ParallelStates, mainState);
firstState->addTransition(this, SIGNAL(goToNextStep()), parallelContainerState);

QFinalState *parallelFinalState = new QFinalState(parallelContainerState);

int parallelStepCounter = 0;
for(;parallelStepCounter < 5; parallelStepCounter++) {
    QState *pState = new QState(parallelContainerState);
    QObject::connect(pState, SIGNAL(entered()), this, SLOT(executePState()));
    pState->addTransition(pState, SIGNAL(finished()), parallelFinalState);
}

QState *reportState = new QState(mainState);
QObject::connect(reportState, SIGNAL(entered()), this, SLOT(generateReport()));
parallelContainerState->addTransition(parallelContainerState, SIGNAL(finished()), reportState);

... set initial state, start machine bla bla...

怎么能等到第二个状态完全结束呢?我也尝试使用 QObject::connect 与每个 pState 的完成信号,但它没有被调用。

谢谢,最好

4

1 回答 1

2

Qt 文档指出:

对于并行状态组,当所有子状态都进入最终状态时会发出 QState::finished() 信号。

这让我相信,与其将 QFinalState 连接到 parallelContainerState,不如将所有子状态连接到它们自己的最终状态。

于 2010-08-26T15:36:47.020 回答