我正在考虑多次使用QProcess来调用一个命令行应用程序(gpio)。每次用户点击一个按钮,就会发出一个命令。
应用程序的输出将被监控并重定向至screeen。代码如下所示。
void Gpio::command(QString argument)
{
// if(process)
// delete process;
process = new QProcess(this);
connect(process, SIGNAL(started()), this, SLOT(onStart()));
connect(process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(onFinish(int,QProcess::ExitStatus)));
connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(readGpio()));
QString program("gpio");
QStringList list = argument.split(" ");
process->start(program, list);
}问:我应该使用delete process吗?这样做我得到了:
QProcess: Destroyed while process is still running.监控exitCode和exitStatus,我发现它们都是0。
这个问题更多的是关于QProcess的正确使用,而"QProcess and shell : Destroyed while process is still running"关注的是特定的错误。
发布于 2015-11-27 21:13:42
因为您不想同时运行多个进程(根据注释),所以不需要多次创建/删除QProcess。
gpio.h
QProcess* m_gpioProcess;gpio.cpp文件
Gpio::Gpio(.....),
.....(),
m_gpioProcess(new QProcess(this))
{
m_gpioProcess->setProgram("gpio");
connect(m_gpioProcess, SIGNAL(started()), this, SLOT(onStart()));
connect(m_gpioProcess, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(onFinish(int,QProcess::ExitStatus)));
connect(m_gpioProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readGpio()));
}
void Gpio::command(const QString& args)
{
if (m_gpioProcess->state() != QProcess::NotRunning) {
qDebug() << "Process already running, ignoring the request";
return;
}
m_gpioProcess->setArguments(args.split(" "));
m_gpioProcess->start();
if (m_gpioProcess->waitForStarted()) {
qDebug() << "Process started with arguments:" << m_gpioProcess->arguments();
}
}如果您希望防止用户多次单击该按钮,请考虑根据m_gpioProcess状态启用/禁用该按钮。
对于Qt 4.8,只需删除此行
m_gpioProcess->setProgram("gpio");这一行
m_gpioProcess->setArguments(args.split(" "));并更改这一行
m_gpioProcess->start();至
m_gpioProcess->start("gpio", args.split(" "));发布于 2015-11-27 23:05:58
看起来在给start打电话之后我忘记了process->waitForFinished();。这似乎解决了问题。
发布于 2021-06-18 15:17:05
添加以下代码可能会有帮助:
process->close();https://stackoverflow.com/questions/33955725
复制相似问题