ドキュメントにはerror()
、子プロセスがクラッシュした場合にシグナルが発行finished()
されると記載されていますが、同様に発行されるのでしょうか、それとも正常に終了した場合にのみ発行されるのでしょうか。
質問する
2077 次
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)
何が起こったのかを(のみ!)接続して解決する薄いラッパークラスを作成しました。newState
QProcess
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 に答える