QStatemachine и параллельные состояния - PullRequest
4 голосов
/ 25 августа 2010

Я схожу с ума от 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, но он не вызывается.

спасибо, лучший

1 Ответ

2 голосов
/ 26 августа 2010

Документация Qt гласит:

Для параллельных групп состояний сигнал QState :: закончен (), когда все дочерние состояния вошли в конечные состояния.

Это наводит меня на мысль, что вместо того, чтобы QFinalState подключался к parallelContainerState, вместо этого подключайте все дочерние состояния к своим собственным конечным состояниям.

...