2010-08-25 4 views
4

Я схожу с ума с QStateMachine wth ParallelState. У меня есть основное состояние (последовательное), которое содержит первое состояние, второе состояние, которое содержит группу параллельных состояний, и другое состояние, которое снова является последовательным. Первое состояние представляет собой процесс, который создает N входных файлов, второй представляет N потоков, которые работает над каждым вводом (один поток для одного файла), а последнее состояние представляет собой процесс, который генерирует отчет общий процесс (необходимо дождитесь завершения второго состояния). Ну, проблема в том, что мне нужно создать барьер между вторым и третьим. Мне нужно некоторое препятствие для того, чтобы заполнить все темы, и я не могу этого сделать. В следующей документации говорится, что составное состояние , которое является параллельным, завершает вызов, когда все его дети входят в конечное состояние. Прежде всего Что это значит, в этом случае, вступая в конечное состояние? Может мне нужно создать конечное состояние для каждого состояния внутри моего параллельного состояния? В любом случае я пробую это, но ничего. В результате, когда первый поток заканчивается, вызывается конечное состояние моего контейнера.QStatemachine и параллельные состояния

Это фрагмент:

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

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

ответ

2

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

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

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