gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:17:50 31 4
gpt4 key购买 nike

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

最佳答案

与您的问题相切的是,您不应该在每个进程中启动一个线程。完成后,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。

关于multithreading - QProcess错误状态5是什么原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10799130/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com