QProcess错误状态5的原因是什么?

时间:2012-05-29 12:26:43

标签: multithreading qt qprocess

我有多个线程运行以下QProcess。随机地它们以错误状态5失败.Qt文档不再提供任何细节。有谁知道这个错误可能来自哪里?非常感谢你。

extCmd = new QProcess(this);

QString cmd = "/usr/bin/php";
QStringList argStr;
argStr << "/bin/sleep" << "10"; // changed to ever working command
extCmd->start(cmd, args);
bool suc = extCmd->waitForFinished(-1);
if (!suc) {
   qDebug() << "finishing failed error=" 
            << extCmd.error() 
            << extCmd.errorString();
}

给我输出:

finishing failed error= 5 "Unknown error"

1 个答案:

答案 0 :(得分:4)

与您的问题相关的是,您应该为每个进程启动一个线程。 QProcess完成后会发出finished(int code, QProcess::ExitStatus status)信号。在成功和不成功启动时,它也将分别发出started()error()。将所有这三个信号连接到QObject中的一个插槽,然后启动该过程,并在插槽中处理结果。你不需要任何额外的线程。

如果您收到started()信号,那么您可以确定该进程的文件名是正确的,并且该进程已启动。无论您从finished(int)获得什么退出代码,都可以指示流程执行的操作,也许是为了响应您可能传递给它的潜在无效参数。如果您收到error()信号,则该过程无法启动,因为您向QProcess::start()提供了错误的文件名,或者您没有正确的权限。

您不应该在异步发生事件的情况下编写同步代码。同步代码是阻止特定事物发生的代码,例如调用waitForCmdFinished。我希望有一个Qt配置标志禁用所有这些剩余的同步阻塞API,就像有一个禁用/启用Qt 3支持API的标志。仅仅提供这些阻止API就会像上面的代码那样引发可怕的黑客攻击。默认情况下应禁用这些API恕我直言。正如应该有一个测试将QThread和派生类移动到另一个线程。这也是我能找到的公开代码的每一个例子中设计糟糕的标志,我做了一个相当彻底的搜索来说服自己我并不疯狂或者其他什么。

我在Qt中对waitxxx方法的唯一合理用法是等待QThread完成。即使这样,也只能在~QThread内调用,以防止QThread在胎面仍在运行时被摧毁。