如何检查QProcess是否正确执行?
How to check if QProcess is executing correctly?
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;
}
}
相关文章:
- 无论条件是否为true,if总是在c++中执行
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 释放动态分配的内存时是否需要执行此额外步骤
- 是否可以在命令行中将输入参数传递给可执行文件
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- 是否可以将具有不同签名的 lambda 存储在 std::vector 中并在函数中执行它们(使用各自的参数)?
- 如何检查参数包是否具有执行顺序中的确切类型
- 在类内和类外的定义处执行类转发声明是否有区别
- 如何检测函数是否执行IO操作
- 检查子类是否执行了方法重写
- Visual Studio 2010 是否执行零初始化
- cv::P oint3f 赋值运算符是否执行"深度"复制?
- 重复Handle()是否执行任何解释性通信(IPC),如果不是为什么目标参数
- SSL是否执行自动重新谈判
- 从另一个成员函数/构造函数调用C++构造函数是否执行初始值设定项列表
- 在线编译器工具是否执行所有操作,或者它们只是检查是否编译
- std::make_shared是否执行值初始化(GCC和clang不同意)
- shared_ptr的删除程序是否执行任何同步?
- 是否执行decltype内的表达式,或者只是检查是否验证