2

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

4

3 回答 3

6

Yes. And it returns you status, as docs state:

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

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

  • 进程结束时只发出一个信号,哪个信号告诉您它是如何结束的(正常或异常)。
  • 每个信号都包括事情如何进行的代码和指向对象的指针,以便用户可以进一步查询。
于 2019-01-03T23:14:34.627 回答