QProcess 学习使用

QProcess

前言:使用QProcess时候,遇到了些问题,上网搜索了后,看了下源码,就记录下。


  • 启动方式:

一、启动外部程序的两种方式:

(1)一体式:void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite)

        外部程序启动后。将随主程序的退出而退出。

(2)分离式:void QProcess::startDetached(const QString & program, const QStringList & arguments, const QString & workingDirectory = QString(), qint64 * pid = 0)

 

  • 启动介绍:

static int execute(const QString &program, const QStringList &arguments);

函数execute是阻塞的,如:execute()=start()+waitforFinished()。

 

QProcess 学习使用

 

void QProcessPrivate::startProcess();

 

Unix源码:

 

QProcess 学习使用

win源码:

QProcess 学习使用


  • 遇到的问题:

1.路径中有空格的问题。

a:需要用到bool QProcess::startDetached ( const QString & program, const QStringList & arguments )或int execute ( const QString & program, const QStringList & arguments)

第二个参数是关键,假如无需给进程传递参数,那么你也要写一个QString();即

QProcess p;

p.startDetached("/*进程路径*/", QString());

 

b:先用QDir::setCurrent("外部程序路径")将当前目录设置到外部执行文件目录,然后直接使用 p->start("test.exe")。必要的话, 再把目录设回来: QDir::setCurrent(QApplication::applicationDirPath())。

 

c:不适用路径中含有空格的路径。

我在项目中通过使用相对路径,避免绝对路径中的空格问题。

 

2.以及外部程序要不要分离式启动的问题。

由于外部程序执行的速度慢使用了分离式,后果是删除任务没有完成,导致更新任务失败。后续通过使用一体式解决了问题。

具体在使用的过程中,以及自己需求完成。


补充:为什么startDetached是分离式的,主要是因为创建进程是否继承句柄导致的。

QProcess 学习使用

继承句柄,在父进程退出时候会退出子进程,反之不会。

具体简单的使用,就看官方文档吧。