1

我有多个线程运行以下 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"
4

1 回答 1

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 在线程仍在运行的情况下被破坏。

于 2012-05-31T19:59:28.700 回答