Выпускается ли QProcess :: Finish в случае сбоя дочернего процесса?

В документации сказано, что error() сигнал будет испускаться, если дочерний процесс падает, но будет finished() быть испущенным также, или это только испускается, когда это успешно выходит?

1

Решение

Да. И он возвращает вам статус, как документы государство:

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

QProcess::NormalExit    0   The process exited normally.
QProcess::CrashExit 1   The process crashed.
6

Другие решения

Вы можете узнать, протестировав это. Напишите небольшую программу, которая выполняет разыменование нулевого указателя (это гарантирует сбой):

struct Foo {
int a;
};

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

Убедитесь, что вы строите без оптимизации, чтобы разыменование не было оптимизировано. Затем запустите его в QProcess и проверьте, finished() испускается.

2

Ответ на этот вопрос, как другие отметили, «Да».

И это кажется мне проблемой, потому что без ссылки на объект, который излучал сигналы, вы должны сделать что-то вроде:

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

Сигналы, которые излучает оболочка, имеют два свойства:

  • По окончании процесса выдается только один сигнал, который сообщает вам, как он завершился (нормально или ненормально).
  • Каждый сигнал включает в себя как код того, как все было сделано, так и указатель на объект, чтобы пользователь мог узнать больше.
1
По вопросам рекламы [email protected]