1

次のQProcessを実行している複数のスレッドがあります。ランダムにエラー状態5で失敗します。Qtのドキュメントにはこれ以上の詳細は記載されていません。誰かがそのエラーが何から来るのか手がかりを持っていますか?どうもありがとうございます。

extCmd = new QProcess(this);

QString cmd = "/usr/bin/php";
QStringList argStr;
argStr << "/bin/sleep" << "10"; // changed to ever working command
extCmd->start(cmd, args);
bool suc = extCmd->waitForFinished(-1);
if (!suc) {
   qDebug() << "finishing failed error=" 
            << extCmd.error() 
            << extCmd.errorString();
}

私に出力を与えます:

finishing failed error= 5 "Unknown error"
4

1 に答える 1

4

問題の正体は、プロセスごとにスレッドを開始するべきではないという事実です。QProcessは、完了するとfinished(int code, QProcess::ExitStatus status)シグナルを発行します。また、起動が成功した場合と失敗した場合にそれぞれ放出されますstarted()error()これら3つの信号すべてをQObjectのスロットに接続し、プロセスを開始して、スロットの結果を処理します。余分なスレッドは必要ありません。

シグナルを受け取った場合はstarted()、プロセスのファイル名が正しく、プロセスが開始されたことを確認できます。取得した終了コードが何であれfinished(int)、おそらくプロセスに渡された可能性のある無効な引数に応答して、プロセスが何をしたかを示します。シグナルを受け取った場合error()は、に間違ったファイル名を指定したQProcess::start()か、正しい権限がないため、プロセスを開始できませんでした。

非同期で発生する同期コードを記述しないでください。同期コードは、の呼び出しなど、特定のことが発生するのをブロックするコードですwaitForCmdFinished。Qt 3サポートAPIを無効/有効にするフラグがあるのと同じように、残りの同期ブロッキングAPIをすべて無効にするQt構成フラグがあればいいのにと思います。これらのブロッキングAPIが利用可能になるだけで、上記のコードのような恐ろしいハッキングが促進されます。これらのAPIは、デフォルトで無効にする必要があります。QThreadと派生クラスを別のスレッドに移動するためのテストがあるはずです。これは、私が見つけた公開されているコードのすべての例での悪い設計の兆候でもあり、私は自分が狂っていないか何かではないことを確信するためにかなり徹底的な検索を行いました。

Qtのメソッドについて私が思い出す唯一の合理的な使用waitxxx法は、QThreadが終了するのを待つことです。~QThreadそれでも、トレッドがまだ実行されている状態でQThreadが破壊されるのを防ぐために、これは内からのみ呼び出す必要があります。

于 2012-05-31T19:59:28.700 に答える