В документации сказано, что error()
сигнал будет испускаться, если дочерний процесс падает, но будет finished()
быть испущенным также, или это только испускается, когда это успешно выходит?
Да. И он возвращает вам статус, как документы государство:
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;
}
}
Сигналы, которые излучает оболочка, имеют два свойства: