2

ドキュメントにはerror()、子プロセスがクラッシュした場合にシグナルが発行finished()されると記載されていますが、同様に発行されるのでしょうか、それとも正常に終了した場合にのみ発行されるのでしょうか。

4

3 に答える 3

6

はい。そして、ドキュメントの状態として、ステータスを返します。

void QProcess::finished ( int exitCode, QProcess::ExitStatus exitStatus ) [signal]

QProcess::NormalExit    0   The process exited normally.
QProcess::CrashExit 1   The process crashed.
于 2012-10-20T18:49:08.677 に答える
1

あなたはそれをテストすることによって見つけることができます。NULLポインターの逆参照を行う小さなプログラムを作成します(これによりクラッシュが保証されます)。

struct Foo {
    int a;
};

int main()
{
    Foo* foo = 0;
    int d = foo->a;
}

逆参照が最適化されないように、最適化せずにビルドするようにしてください。次に、QProcessで実行し、finished()放出されているかどうかを確認します。

于 2012-10-20T18:44:24.560 に答える
1

質問に対する答えは、他の人が指摘しているように、「はい」です。

そして、それは私にとって問題のように感じます。なぜなら、信号を発したオブジェクトへの参照がなければ、次のようなことをしなければならないからです。

void on_finished( int exitCode, QProcess::ExitStatus exitStatus )
{
    if ( existStatus == QProcess::CrashExit )
    {
        // We'll handle in on_errorOccured()
        return;
    }

    // ...
}


void on_errorOccured( QProcess::ProcessError error )
{
    // ...
}

受け入れる代わりに、オブジェクトを使用して呼び出したときにQProcess::stateChanged(QProcess::ProcessState newState)何が起こったのかを(のみ!)接続して解決する薄いラッパークラスを作成しました。newStateQProcess

void ProcessWrapper::on_stateChanged(QProcess::ProcessState newState)
{
    switch (newState)
    {
    case QProcess::Starting:
        // No action needed
        break;
    case QProcess::Running:
        emit( started( this ) );
        break;
    case QProcess::NotRunning:
        if ( m_process.exitStatus() != QProcess::NormalExit )
            emit( crashed( this, m_process.error() ) );
        else
            emit( finished( this, m_process.exitCode() ) );
        break;
    }
}

ラッパーが発する信号には、次の2つのプロパティがあります。

  • プロセスが終了すると、1つの信号のみが発行され、どの信号がプロセスの終了方法(正常または異常)を示します。
  • 各シグナルには、ユーザーがさらに問い合わせることができるように、物事がどのように行われたかを示すコードとオブジェクトへのポインターの両方が含まれています。
于 2019-01-03T23:14:34.627 に答える