首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确使用Qt QProcess

正确使用Qt QProcess
EN

Stack Overflow用户
提问于 2015-11-27 18:49:17
回答 3查看 1.5K关注 0票数 0

我正在考虑多次使用QProcess来调用一个命令行应用程序(gpio)。每次用户点击一个按钮,就会发出一个命令。

应用程序的输出将被监控并重定向至screeen。代码如下所示。

代码语言:javascript
复制
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吗?这样做我得到了:

代码语言:javascript
复制
QProcess: Destroyed while process is still running.

监控exitCodeexitStatus,我发现它们都是0

这个问题更多的是关于QProcess的正确使用,而"QProcess and shell : Destroyed while process is still running"关注的是特定的错误。

EN

回答 3

Stack Overflow用户

发布于 2015-11-27 21:13:42

因为您不想同时运行多个进程(根据注释),所以不需要多次创建/删除QProcess

gpio.h

代码语言:javascript
复制
QProcess*   m_gpioProcess;

gpio.cpp文件

代码语言:javascript
复制
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,只需删除此行

代码语言:javascript
复制
m_gpioProcess->setProgram("gpio");

这一行

代码语言:javascript
复制
m_gpioProcess->setArguments(args.split(" "));

并更改这一行

代码语言:javascript
复制
m_gpioProcess->start();

代码语言:javascript
复制
m_gpioProcess->start("gpio", args.split(" "));
票数 1
EN

Stack Overflow用户

发布于 2015-11-27 23:05:58

看起来在给start打电话之后我忘记了process->waitForFinished();。这似乎解决了问题。

票数 0
EN

Stack Overflow用户

发布于 2021-06-18 15:17:05

添加以下代码可能会有帮助:

代码语言:javascript
复制
process->close();
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33955725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档