linux环境下QT使用QProcess 关闭程序

Windows关闭程序的方法:

在qt代码里有时需要qprocess调用第三方程序,调用完后需要终止。手动叉掉不合适。此时可以调用window下的taskkill程序关闭该程序

QProcess process;
process.execute("taskkill /im xx.exe /f");

linux关闭程序的方法

在Ubuntu中可以使用kill命令来终止进程。为了在Qt代码中使用kill命令,可以通过继承QProcess类来实现。
代码如下:

```
#include <QtCore>

class MyProcess : public QProcess {
public:
  void stopProcess() {
    if (state() != QProcess::NotRunning) {
      terminate(); // 发送SIGTERM信号
      waitForFinished(); // 等待进程终止
    }
  }
};

int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);
  
  MyProcess process;
  process.start("your_program"); //调用需要终止的程序

  process.stopProcess(); //终止程序

  return a.exec();
}
```

这里使用了自定义的MyProcess类继承QProcess,并添加了stopProcess()方法来实现终止进程的功能。

stopProcess()方法会先发送SIGTERM信号终止进程,然后等待进程完全终止。如果不调用waitForFinished(),那么可能会导致进程没有完全终止就被关闭。

继续改进这个代码,在MyProcess类里面封装获得执行的console的程序的输出内容并切实时的qdebug出来显示。
寻找更优解,好的,我可以继续改进这个代码来封装获得执行的console的程序的输出内容并实时地QDebug出来显示。
修改后的代码如下:

```
#include <QtCore>

class MyProcess : public QProcess {
public:
    MyProcess() {
        connect(this, &QProcess::readyReadStandardOutput, [=](){
            QByteArray output = this->readAllStandardOutput();
            //QByteArray转QString并移除结尾的换行符
            QString text(output);
            text.chop(1);
            qDebug() << text;
        });
    }

    void stopProcess() {
        if (state() != QProcess::NotRunning) {
            terminate(); // 发送SIGTERM信号
            waitForFinished(); // 等待进程终止
        }
    }
};

int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);
  
  MyProcess process;
  process.start("your_program"); //调用需要终止的程序

  process.waitForFinished(); //等待程序执行结束

  return a.exec();
}
```

在MyProcess类的构造函数中,我添加了一个连接到QProcess的`readyReadStandardOutput()`信号的lambda表达式,用于实时获取调用的程序输出的内容,并通过QDebug实时进行输出。

然后在程序中,我们调用process的waitForFinished()方法等待程序执行完毕即可。在程序运行过程中,MyProcess类会将获得的调用程序的输出内容输出到控制台。

注意:使用waitForFinished()方法会阻塞程序的运行,如果产生大量输出内容,程序可能会因为阻塞而无法响应。如果需要避免阻塞,可以使用QProcess的信号和槽来实现。

在这个例子qDebug() << text;的执行是在stopProcess()  process.waitForFinished();   等待程序执行结束 之后才打印出来的。有没有办法实时的输出执行的程序的实时输出信息?

这个问题是因为`qDebug() << text`在MyProcess类中的信号槽函数中是使用的异步操作,即当获得程序输出时会发送信号通知到主线程输出,在主线程中有可能还在等待程序执行完毕,因此需要等到程序执行完毕后才输出。

为了实现实时输出执行程序的输出信息,我们需要将`qDebug() << text`的输出移到主进程中来执行。具体实现可以通过在主进程中建立一个循环来实时读取MyProcess类中存储的输出缓存,并将其输出到控制台上。
代码如下:

```
#include <QtCore>

class MyProcess : public QProcess {
public:
    MyProcess() {
        connect(this, &QProcess::readyReadStandardOutput, [=](){
            QByteArray output = this->readAllStandardOutput();
            //QByteArray转QString并移除结尾的换行符
            QString text(output);
            text.chop(1);
            outputBuffer.append(text);
        });
    }

    void stopProcess() {
        if (state() != QProcess::NotRunning) {
            terminate(); // 发送SIGTERM信号
            waitForFinished(); // 等待进程终止
            qDebug() << outputBuffer; // 输出存储的输出缓存
        }
    }

protected:
    QString outputBuffer;
};

int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);

  MyProcess process;
  process.start("your_program"); //调用需要终止的程序

  while(process.state() != QProcess::NotRunning){
      a.processEvents(); //触发主进程事件循环,处理传入的事件
      QByteArray output = process.readAllStandardOutput();
      if(!output.isEmpty()){
          QString text(output); 
          text.chop(1);
          qDebug() << text; //实时输出程序的输出内容
      }
  }

  process.stopProcess(); //终止程序

  return a.exec();
}
```

在这个修改后的代码中,我们添加了一个`outputBuffer`成员变量,用于存储程序的输出缓存。在MyProcess类的`readyReadStandardOutput()`信号槽函数中,将获得的程序输出存储到输出缓存之中。

主进程中,我们使用一个while循环来不断处理事件,并检查是否存在程序输出。
如果程序有输出,我们将其实时输出,否则等待程序执行结束后,再次通过调用`stopProcess()`方法来输出程序的输出缓存。

这样一来,我们就可以实时追踪处理程序的输出内容了。《但是最终并没有实现看到这个实施现象。
            
 

猜你喜欢

转载自blog.csdn.net/thanklife/article/details/131105862