gpt4 book ai didi

c++ - QProcess多次启动后给出FailedToStart

转载 作者:行者123 更新时间:2023-12-02 10:07:37 25 4
gpt4 key购买 nike

我正在尝试在线程内使用QProcess进行一些操作(读取I2C连接)。update方法每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”错误,并且再也不会启动。

enter image description here
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 失败):打开的文件太多”

enter image description here

更新:终于我找到了这个问题,它与QProcess本身无关。它与I2C连接有关。

最佳答案

我的猜测是您失败了,因为所有update()调用都共享同一个QProcess对象。

这里发生的是,当您调用update()时,就开始了该过程。而在100毫秒之后,您无需确保先前的update()已经完成以等待过程结束就再次调用它。
结果是您尝试启动一个已经开始的进程,因此失败。

对我来说,最简单的解决方案是为每个QProcess调用创建一个update()对象。
就像是:

void TempsReader::update()
{
QProcess * current_process = new QProcess;

connect(current_process, &QProcess::errorOccured, this, &TempReader::onProcessError);
connect(current_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, &TempReader::onProcessFinished());

current_process->start("sh"); // Your command
current_process->waitForStarted();
current_process->write("i2cdetect -y 1");
current_process->waitForFinished();

current_process->deleteLater();
}

或没有指针:
void TempsReader::update()
{
QProcess current_process;

connect(&current_process, &QProcess::errorOccured, this, &TempReader::onProcessError);
connect(&current_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, &TempReader::onProcessFinished());

current_process.start("sh"); // Your command
current_process.waitForStarted();
current_process.write("i2cdetect -y 1");
current_process.waitForFinished();
}

由于您没有显示代码的调用部分(线程创建,100ms循环等),因此这可能不是您需要的解决方案。
在这种情况下,如果无法解决您的问题,请告诉我,以便我删除此答案。

关于c++ - QProcess多次启动后给出FailedToStart,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59392642/

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