在Qt4中,QProcess作为QIODevice的继承类,主要用来实现启动外部应用程序,并且进行进程间通信的。
调起外部程序,主要有两种方式: start()和startDetached()。这两种方式的区别是,start()后的进程与原有进程属于父子进程关系,当父进程退出后,被调起的进程也会结束;而startDetached()会在程序调起完成后,将这两个进程分离开来。
(1)
start()方法可以这样使用:
QProcess *pProcess = new QProcess(this);
pProcess->start(process_path);
不过这里本人有个疑问, pProcess应该是什么时候去delete的呢?如果不使用new来创建,而在栈上创建QProcess对象有什么区别(如:QProcess process)?
(2)
startDetached()的方法可以这样使用():
QProcess::startDetached(process_path);
QProcess类还重载了这几个方法,如
bool | startDetached ( const QString & program, const QStringList & arguments, const QString & workingDirectory, qint64 * pid = 0 ) |
bool | startDetached ( const QString & program, const QStringList & arguments ) |
bool | startDetached ( const QString & program ) |
参数workingDirectory指定了程序运行的工作目录,当有数据输出时,会根据此来获得输出的相对路径及位置。
参数arguments应该是在该程序被启动后,用作数据传递吧;没有实践过这个参数,有待验证。
而这几个方法被设计为静态方法,很想知道这样设计的好处(免于创建对象外)和原理。
(3)对于QProcess的机制,大致可以理解为:在Qt4版本之前,QProcess是利用socket的双向通道机制实现了进程间的通信;但由于QProcess实际上只是实现了单向通信功能,浪费了socket的部分资源,在Qt4改用无名管道的通信机制(使用至少两个单向通信的管道来实现进程间通信)。
对于QProcess的应用场合,和信号/槽机制有点相对:信号/槽机制用于内部对象间通信;而QProcess则用于与外部对象通信,或所谓进程间通信。