我和QStateMachine和ParallelState都快疯了。我有一个主状态(顺序),它包含第一状态,第二状态包含一组并行状态,另一状态又是顺序的。第一状态表示创建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::连接每个pState的已完成信号,但它不会被调用。
谢谢你,最好
发布于 2010-08-26 15:36:47
Qt文档指出:
对于并行状态组,当所有子状态都进入了最终状态时,就会发出QState::
()信号。
这使我相信,与其让QFinalState连接到parallelContainerState,不如将所有子状态连接到自己的最终状态。
https://stackoverflow.com/questions/3568994
复制相似问题