4

ParallelState を使用した QStateMachine に夢中です。最初の状態、並列状態のグループを含む 2 番目の状態、および再び順次の別の状態を含むメイン状態 (順次) があります。最初の状態は N 個の入力ファイルを作成するプロセスを表し、2 番目の状態は各入力に対して動作する N 個のスレッド (1 つのファイルに対して 1 つのスレッド) を表し、最後の状態はプロセス全体のレポートを生成するプロセスを表します (その秒を待つ必要があります)。状態は完全に終了しています)。問題は、2 番目の状態と 3 番目の状態の間にバリアを作成する必要がある場合です。すべてのスレッドを完了するにはバリアが必要ですが、それができません。ドキュメントに従って、並列である複合状態は、そのすべての子が最終状態に入ったときに終了したと言われています。まず、この場合、最終状態に入るということは何を意味するのでしょうか。パラレル ステート内の各ステートに対して最終ステートを作成する必要がありますか? とにかく私はこれを試しますが、何もしません。その結果、最初のスレッドが終了すると、コンテナーの最終状態が呼び出されます。

これはスニペットです:

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...

2 番目の状態が完全に終了するのを待つにはどうすればよいでしょうか。また、各 pState の終了シグナルで QObject::connect を使用しようとしましたが、呼び出されません。

ありがとう、最高

4

1 に答える 1

2

Qt のドキュメントには、次のように記載されています。

パラレル ステート グループの場合、すべての子ステートが最終ステートに入ると、QState::finished() シグナルが発行されます。

これにより、 QFinalState を parallelContainerState に接続するのではなく、すべての子状態を独自の最終状態に接続するようになると思います。

于 2010-08-26T15:36:47.020 に答える