QProcess 多次启动后给出 FailedToStart
QProcess give FailedToStart after starting multiple times
我正在尝试在线程内使用 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() 给出:"Resource error (fork failure): Too many open files"
更新:终于我找到了问题,它与 QProcess 本身无关。与I2C连接有关。
我猜你会失败,因为你所有的 update()
调用共享同一个 QProcess
对象。
这里发生的事情是,当您调用 update()
时,您就开始了这个过程。而 100ms 之后,你再次调用它,而没有确保之前的 update()
已经完成等待进程结束。
结果是您尝试启动一个已经启动的进程,因此它失败了。
对我来说,最简单的解决方案是为每个 update()
调用创建一个 QProcess
对象。
类似于:
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(¤t_process, &QProcess::errorOccured, this, &TempReader::onProcessError);
connect(¤t_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();
}
由于您没有显示代码的调用部分(线程创建、100 毫秒循环……),这可能不是您需要的解决方案。
在这种情况下,如果它不能解决您的问题,请告诉我,以便我删除此答案。
终于我找到了问题,它与 QProcess 本身无关。它与 I2C 连接有关。我在更新中使用了这个命令: wiringPiI2CSetup(addr);每次都会打开一个新设备。
我正在尝试在线程内使用 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() 给出:"Resource error (fork failure): Too many open files"
更新:终于我找到了问题,它与 QProcess 本身无关。与I2C连接有关。
我猜你会失败,因为你所有的 update()
调用共享同一个 QProcess
对象。
这里发生的事情是,当您调用 update()
时,您就开始了这个过程。而 100ms 之后,你再次调用它,而没有确保之前的 update()
已经完成等待进程结束。
结果是您尝试启动一个已经启动的进程,因此它失败了。
对我来说,最简单的解决方案是为每个 update()
调用创建一个 QProcess
对象。
类似于:
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(¤t_process, &QProcess::errorOccured, this, &TempReader::onProcessError);
connect(¤t_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();
}
由于您没有显示代码的调用部分(线程创建、100 毫秒循环……),这可能不是您需要的解决方案。
在这种情况下,如果它不能解决您的问题,请告诉我,以便我删除此答案。
终于我找到了问题,它与 QProcess 本身无关。它与 I2C 连接有关。我在更新中使用了这个命令: wiringPiI2CSetup(addr);每次都会打开一个新设备。