我有多个线程运行以下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"
答案 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在胎面仍在运行时被摧毁。