Qt 学习之路 2(69):进程
来源:互联网 发布:诗尼曼怎么样 知乎 编辑:程序博客网 时间:2024/06/15 01:31
进程是操作系统的基础之一。一个进程可以认为是一个正在执行的程序。我们可以把进程当做计算机运行时的一个基础单位。关于进程的讨论已经超出了本章的范畴,现在我们假定你是了解这个概念的。
在 Qt 中,我们使用QProcess
来表示一个进程。这个类可以允许我们的应用程序开启一个新的外部程序,并且与这个程序进行通讯。下面我们用一个非常简单的例子开始我们本章有关进程的阐述。
这是一段 Qt5 的程序,并且仅能运行于 Windows 平台。简单来说,这段程序通过 Qt 开启了一个新的进程,这个进程相当于执行了下面的命令:
注意,我们可以在上面的程序中找到这个命令的每一个字符。事实上,我们可以把一个进程看做执行了一段命令(在 Windows 平台就是控制台命令;在 Linux 平台(包括 Unix)则是执行一个普通的命令,比如 ls)。我们的程序相当于执行了 dir 命令,其参数是 C:\,这是由arguments
数组决定的(至于为什么我们需要将 dir 命令作为参数传递给 cmd.exe,这是由于 Windows 平台的规定。在 Windows 中,dir 命令并不是一个独立的可执行程序,而是通过 cmd.exe 进行解释;这与 ls 在 Linux 中的地位不同,在 Linux 中,ls 就是一个可执行程序。因此如果你需要在 Linux 中执行 ls,那么program
的值应该就是 ls )。
上面程序的运行结果类似于:
上面的输出会根据不同机器有所不同。豆子是在 Windows 8.1 64位机器上测试的。
为了开启进程,我们将外部程序名字(program
)和程序启动参数(arguments
)作为参数传给QProcess::start()
函数。当然,你也可以使用setProgram()
和setArguments()
进行设置。此时,QProcess
进入Starting
状态;当程序开始执行之后,QProcess
进入Running
状态,并且发出started()
信号。当进程退出时,QProcess
进入NotRunning
状态(也是初始状态),并且发出finished()
信号。finished()
信号以参数的形式提供进程的退出代码和退出状态。如果发送错误,QProcess
会发出error()
信号
QProcess
允许你将一个进程当做一个顺序访问的 I/O 设备。我们可以使用write()
函数将数据提供给进程的标准输入;使用read()
、readLine()
或者getChar()
函数获取其标准输出。由于QProcess
继承自QIODevice
,因此QProcess
也可以作为QXmlReader
的输入或者直接使用QNetworkAccessManager
将其生成的数据上传到网络。
进程通常有两个预定义的通道:标准输出通道(stdout)和标准错误通道(stderr)。前者就是常规控制台的输出,后者则是由进程输出的错误信息。这两个通道都是独立的数据流,我们可以通过使用setReadChannel()
函数来切换这两个通道。当进程的当前通道可用时,QProcess
会发出readReady()
信号。当有了新的标准输出数据时,QProcess
会发出readyReadStandardOutput()
信号;当有了新的标准错误数据时,则会发出readyReadStandardError()
信号。我们前面的示例程序就是使用了readReady()
信号。注意,由于我们是运行在 Windows 平台,Windows 控制台的默认编码是 GBK,为了避免出现乱码,我们必须设置文本的编码方式。
通道的术语可能会引起误会。注意,进程的输出通道对应着QProcess
的 读 通道,进程的输入通道对应着QProcess
的 写 通道。这是因为我们使用QProcess
“读取”进程的输出,而我们针对QProcess
的“写入”则成为进程的输入。QProcess
还可以合并标准输出和标准错误通道,使用setProcessChannelMode()
函数设置MergedChannels
即可实现。
另外,QProcess
还允许我们使用setEnvironment()
为进程设置环境变量,或者使用setWorkingDirectory()
为进程设置工作目录。
前面我们所说的信号槽机制,类似于前面我们介绍的QNetworkAccessManager
,都是异步的。与QNetworkAccessManager
不同在于,QProcess
提供了同步函数:
waitForStarted()
:阻塞到进程开始;waitForReadyRead()
:阻塞到可以从进程的当前读通道读取新的数据;waitForBytesWritten()
:阻塞到数据写入进程;waitForFinished()
:阻塞到进程结束;
注意,在主线程(调用了QApplication::exec()
的线程)调用上面几个函数会让界面失去响应。
- Qt 学习之路 2(69):进程
- Qt 学习之路 2(70):进程间通信
- Qt学习之路之进程条
- Qt学习之路(58): 进程间交互
- Qt学习之路(58): 进程间交互
- Qt学习之路(58): 进程间交互
- Qt学习之路(58): 进程间交互
- Qt学习之路(58): 进程间交互
- Qt 学习之路 2(2):Qt 简介 笔记
- Qt 学习之路 2(2):Qt 简介
- Qt 学习之路 2(6):Qt 模块简介
- Qt 学习之路 2(83):Qt Quick Controls
- Qt 学习之路 2(6):Qt 模块简介
- Qt 学习之路 2(83):Qt Quick Controls
- QT学习之路十五(进程通信——系统剪切板和共享内存)
- Qt 学习之路 2
- Qt学习之路2
- Qt 学习笔记2 摘自《Qt 学习之路 2》
- 安装 scrapy
- 牛车
- mysql数据库和表操作
- 如何复制IDEA的错误提示信息
- linux tmux的经验总结
- Qt 学习之路 2(69):进程
- 软件测试工程师必读图书
- JSP代码练习(六)
- 《数据结构》实验二:线性表综合实验——(5)间接寻址
- Servlet与MVC分层开发
- Leetcode之Rotate List 问题
- 【线段树+Hash】Codeforces 452F Permutation
- 一点一点学线程(四)concurrent包
- xshell连接树莓派lxpanel配置