2010-08-25 91 views
4

我正在用QStateMachine和ParallelState發瘋。 我有一個主要狀態(順序),其中包含第一個狀態, 第二個狀態,其中包含一組並行狀態,另一個狀態是再次順序。 第一個狀態表示創建N個輸入文件的過程,第二個狀態表示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,而是將所有子狀態連接到它們自己的最終狀態。