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()。
void QProcessPrivate::startProcess();
Unix源码:
win源码:
-
遇到的问题:
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是分离式的,主要是因为创建进程是否继承句柄导致的。
继承句柄,在父进程退出时候会退出子进程,反之不会。
具体简单的使用,就看官方文档吧。