如果儿童进程崩溃,则QPROCESS ::已完成



该文档说,如果子进程崩溃,error()信号将发出,但也会发出finished(),还是仅在成功退出时发出?

是。它返回您的状态,如Docs状态:

void QProcess::finished ( int exitCode, QProcess::ExitStatus exitStatus ) [signal]
QProcess::NormalExit    0   The process exited normally.
QProcess::CrashExit 1   The process crashed.

您可以通过测试来找出答案。编写一个执行空指针取消的小程序(这将保证崩溃):

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

确保您没有优化构建,以免取消优化。然后在QProcess中运行它,并检查finished()是否正在排放。

问题的答案是,正如其他人所指出的那样,"是。"

对我来说感觉就像是一个问题,因为没有提及发出信号的对象,您必须执行以下操作:

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;
    }
}

信号包装器发射的属性有两个属性:

  • 当一个过程结束时只发出一个信号,哪个信号告诉您它的结局(通常或异常)。
  • 每个信号都包含有关事物的做法和指向对象的指针的代码,以便用户可以进一步查询。

最新更新