【发布时间】:2023-06-23 07:40:02
【问题描述】:
我正在尝试在线程中使用 QProcess 来执行一些操作(读取 I2C 连接)。更新方法每 100 毫秒调用一次:
void TempsReader::update()
{
if (_currProcess == nullptr) {
_currProcess = new QProcess();
connect(_currProcess, &QProcess::errorOccurred, this, &TempsReader::onProcessError);
connect(_currProcess, SIGNAL(finished(int,QProcess::ExitStatus)),
this, SLOT(onProcessFinished()));
}
_currProcess->start("sh");
if (_currProcess->waitForStarted()) {
_currProcess->write("i2cdetect -y 1");
_currProcess->closeWriteChannel();
_currProcess->waitForFinished();
}
}
一段时间后,该过程会出现“FailedToStart”错误并且不再启动。
void TempsReader::onProcessError(QProcess::ProcessError error)
{
qDebug() << error;
_currProcess->close();
}
void TempsReader::onProcessFinished()
{
QString devs = _currProcess->readAll();
_currProcess->waitForFinished();
// doing some stuff with devs
_currProcess->close();
}
我该如何解决这个问题?我是否以错误的方式使用 QProcess?以及当它掉入错误槽时如何再次启动该过程。提前致谢。
更新:QProcess::errorString() 给出:“资源错误(fork 失败):打开的文件太多”
更新:最后我发现了这个问题,它与 QProcess 本身无关。它与 I2C 连接有关。
【问题讨论】:
-
可能会出现几个问题。首先,尝试使用
readAllStandardError和readAllStandardOutput获取进程的输出,以查看命令(i2cdetect)是否返回一些错误。另外,获取进程的state以查看它是否完成,如果没有,您可能需要terminate或kill进程。而且,你可能需要在结束后delete _currProcess;。 -
我认为失败是因为您的
update()函数被多次调用但在同一个QProcess上工作。如果你打电话给update(),你就开始这个过程,很好。但是,如果您再次调用update()而没有确保之前的update()已经完成(仍在等待进程结束),您将尝试启动一个已经启动的进程(因为您使用相同的QProcess对象),因此启动会失败。 -
@acraig5075 好点! : "资源错误(fork 失败):打开的文件太多"
-
@user1810087 readAllStandardError/Output 什么也没给出!