设计应用程序时,有时不希望将一个不太相关的功能集成到程序中,或者是因为该功能与当前设计的应用程序关系不大,或者是因为该功能已经可以使用现成的程序很好实现了,这时就可以在当前的应用程序中调用外部的程序来实现该功能,这就会使用到进程。
Qt应用程序可以很容易地启动一个外部应用程序,而且Qt提供了多种进程间通讯的方法。
运行一个进程
- Qt的QProcess类用来启动一个外部程序并与其进行通信。
- 要启动一个进程,可以使用start()函数,然后将程序名称和运行这个程序所要使用的命令行参数作为该函数的参数。
- 执行完start()函数后,QProcess进入Starting状态,当程序已经运行后,QProcess就会进入Running状态并发射started()信号。
- 当进程退出后,QProcess重新进入NotRunning状态(初始状态)并发射finished()信号。
- 发射的finished()信号提供了进程的退出代码和退出状态,也可以调用exitCode()来获取上一个结束的进程的退出代码,使用exitStatus()来获取它的退出状态。
- 任何时间发生了错误,QProcess都会发射error()信号,也可以调用error()来查看错误的类型和上次发生的错误。
- 使用state()可以查看当前进程的状态。
-
QProcess允许将一个进程视为一个顺序I/O设备。可以像使用QTcpSocket访问一个网络连接一样来读/写一个进程。
-
可以调用write()向进程的标准输入进行写入,调用read()、readline()和getChar()等从标准输出进行读取。因为QProcess继承自QIODevic,它也可以作为QXmlReader的数据源,或者为QNetworkAccessManager产生用于上传的数据。
-
QProcess也提供了一组函数,可以脱离事件循环来使用,它们会挂起调用的进程直到确定的信号被发射:
- waitForStarted()阻塞,直到进程启动;
- waitForReadyRead()阻塞,直到在当前读通道上有可读的数据;
- waitForBytesWritten阻塞,直到进程结束;
在主进程中(调用QApplication::exec()函数的进程),调用这些函数可能引起用户界面的冻结。
进程间通信
方法:
1、TCP/IP
2、共享内存 QShareMemory
3、D-Bus
4、QProcess
5、会话管理