Я схожу с ума от 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 :: connect с готовым сигналом каждого
pState, но он не вызывается.
спасибо,
лучший