如何检查QProcess是否正确执行?

How to check if QProcess is executing correctly?

本文关键字:是否 执行 QProcess 何检查 检查      更新时间:2023-10-16
QProcess process_sdcompare;
QString command_sdcompare;
QStringList args_sdcompare;
command_sdcompare = "diff";
args_sdcompare << "Filename" << "Filename";
process_sdcompare.start(command_sdcompare,args_sdcompare,QIODevice::ReadOnly);
process_sdcompare.waitForFinished();                                        
QString StdOut_sdcompare = process_sdcompare.readAllStandardOutput(); //Reads standard output
QString StdError_sdcompare = process_sdcompare.readAllStandardError(); //Reads standard error
if(StdOut_sdcompare.isEmpty())  //the process output is checked here if empty it is a success
return 1;

我正在运行上面的代码。当我在比较不相似的文本文件后检查错误条件时,isEmpty()返回false

如何检查QProcess执行是否没有错误?

我使用QProcess::error()来查询最后一个错误(用于快速调试),但是一种"更好"的方法:

// capture any errors (do this before you run the process)
connect(&process_sdcompare, &QProcess::errorOccurred, this, &ThisClass::processError);

然后定义插槽:

ThisClass::processError(QProcess::ProcessError error)
{
qDebug() << "error enum val = " << error << endl;
}

更新

或者使用 Lambda:

// No need to define a slot function...
connect(&process_sdcompare, &QProcess::errorOccurred, [=](QProcess::ProcessError error) 
{ 
qDebug() << "error enum val = " << error << endl; 
});

我认为所有的状态和错误函数对于确定流程执行是否真的成功都是毫无用处的。例如,尝试执行一个不存在的程序(在窗口下):

error(): QProcess::ProcessError(FailedToStart)
exitStatus(): QProcess::ExitStatus(NormalExit)
exitCode(): 0
errorString(): "Process failed to start: Das System kann die angegebene Datei nicht finden."

如果进程实际成功执行:

error(): QProcess::ProcessError(UnknownError)
exitStatus(): QProcess::ExitStatus(NormalExit)
exitCode(): 0
errorString(): "Unknown error"

因此,我认为"未知错误"不是成功的指标。

我认为解决方案可能如下所示:

QProcess *m_proc = new QProcess(this);
bool errorOccured = false;
QProcess::ProcessError procError;
QObject::connect(m_proc, &QProcess::errorOccurred, [&](QProcess::ProcessError error)
{
procError = error;
errorOccured = true;
});
m_proc->start(...);

waitForFinished返回时,它会返回一个大致指示成功的bool。正如 Karsten 所建议的那样,您可以使用QProcess::exitCode检查实际成功或失败。

这就是你使用QProcess的方式

QProcess process_sdcompare;
QStringList args_sdcompare;
args_sdcompare << "Filename" << "Filename";    
process_sdcompare.setProgram("diff");
process_sdcompare.setArguments(args_sdcompare);
process_sdcompare.start();
if (process_sdcompare.waitForStarted() && process_sdcompare.waitForFinished()) {
QString StdOut_sdcompare = process_sdcompare.readAllStandardOutput();   
QString StdError_sdcompare = process_sdcompare.readAllStandardError();
if(StdOut_sdcompare.isEmpty())
return 1;
}
}