进程是操作系统的基础之一。一个进程可以认为是一个正在执行的程序。我们可以把进程当做计算机运行时的一个基础单位。关于进程的讨论已经超出了本章的范畴,现在我们假定你是了解这个概念的。

在 Qt 中,我们使用QProcess来表示一个进程。这个类可以允许我们的应用程序开启一个新的外部程序,并且与这个程序进行通讯。下面我们用一个非常简单的例子开始我们本章有关进程的阐述。

//!!! Qt5

QString program = "C:/Windows/System32/cmd.exe";

QStringList arguments;

arguments << "/c" << "dir" << "C:\\";

QProcess *cmdProcess = new QProcess;

QObject::connect(cmdProcess, &QProcess::readyRead, [=] () {

QTextCodec *codec = QTextCodec::codecForName("GBK");

QString dir = codec->toUnicode(cmdProcess->readAll());

qDebug() << dir;

});

cmdProcess->start(program, arguments);

这是一段 Qt5 的程序,并且仅能运行于 Windows 平台。简单来说,这段程序通过 Qt 开启了一个新的进程,这个进程相当于执行了下面的命令:

C:\\Windows\\System32\\cmd.exe /c dir C:\\

注意,我们可以在上面的程序中找到这个命令的每一个字符。事实上,我们可以把一个进程看做执行了一段命令(在 Windows 平台就是控制台命令;在 Linux 平台(包括 Unix)则是执行一个普通的命令,比如 ls)。我们的程序相当于执行了 dir 命令,其参数是 C:\,这是由arguments数组决定的(至于为什么我们需要将 dir 命令作为参数传递给 cmd.exe,这是由于 Windows 平台的规定。在 Windows 中,dir 命令并不是一个独立的可执行程序,而是通过 cmd.exe 进行解释;这与 ls 在 Linux 中的地位不同,在 Linux 中,ls 就是一个可执行程序。因此如果你需要在 Linux 中执行 ls,那么program的值应该就是 ls )。

上面程序的运行结果类似于:

驱动器 C 中的卷是 SYSTEM

卷的序列号是 EA62-24AB

C:\ 的目录

2013/05/05 20:41 1,024 .rnd

2013/08/22 23:22

2013/10/18 07:32

2013/10/30 12:36

2013/10/31 20:30 12,906 shared.log

2013/10/18 07:33

2013/11/06 21:41

2 个文件 13,930 字节

5 个目录 22,723,440,640 可用字节

上面的输出会根据不同机器有所不同。豆子是在 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计算机控制进程,Qt 学习之路 2(69):进程相关推荐

  1. 《Qt 学习之路 2》

    Home / Qt 学习之路 2 / <Qt 学习之路 2>目录 <Qt 学习之路 2>目录 序 Qt 前言 Hello, world! 信号槽 自定义信号槽 Qt 模块简介 ...

  2. 转载: Qt 学习之路 2归档

    Qt 学习之路 2归档 http://www.devbean.net/2012/08/qt-study-road-2-catelog/

  3. 对QT学习之路12-14的源代码补充与修正

    QT学习之路12-14的源代码有些不完整,为了更好的让大家学习,本人做了一点修正与补充,谢谢.源代码如下: 头文件: #ifndef MAINWINDOW_H #define MAINWINDOW_H ...

  4. c gui qt 4编程第二版_我的QT5学习之路(一)——浅谈QT的安装和配置

    一.前言 说到Qt,不能不说到C++,这门伟大的语言.因为其面向对象的编程思想和陡峭的学习曲线,一开始学习起来很是吃力.Qt从QT4开始基本封装了很多C++的工具库和界面库,而且支持跨平台,这是它最大 ...

  5. java qt gui_工控编程,Qt 学习之路

    原标题:工控编程,Qt 学习之路 Qt 是一个著名的 C++ 库--或许并不能说这只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI.使用 Qt,在一定程序上你获得的是一个"一站 ...

  6. Qt学习之路_12(简易数据管理系统)

    原文地址为: Qt学习之路_12(简易数据管理系统) 前言 最近从大陆来到台湾,之间杂事很多,挤不出时间来更新博客- 这次主要是通过做一个简易的数据库管理系统,来学习在Qt中对数据库,xml,界面的各 ...

  7. QT学习之路2 学习笔记

    QT学习之路2 学习笔记 1.Qt 是一个著名的 C++ 应用程序框架.你并不能说它只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI 组件.使用 Qt,在一定程度上你获得的是一个&quo ...

  8. alin的学习之路:Qt与多线程

    alin的学习之路:Qt与多线程 如果程序在进行复杂的逻辑处理过程中, 对窗口进行操作, 就会出现无响应的情况. 如何解决这样的问题与高并发的问题? 需要使用多线程. 方式1 特点:简单 创建一个自定 ...

  9. QT学习之路(一)ubuntu 18.04的Qt Creator在线安装

    文章目录 前言 一.准备工作 二.安装步骤 参考链接 前言 Qt是嵌入式开发的必备工具之一,在Linux下安装尤其重要. Qt是C++的一个库,或者说是开发框架,里面集成了一些库函数,提高开发效率. ...

最新文章

  1. css 伪元素::after与::before的使用
  2. Linux版本之redhat9---gFtp中文乱码解决方案
  3. 利用相机SDK采相转换至HImage
  4. 计算机科学与导论期末论文,计算机科学与导论论文3
  5. 自动点击器一秒200_做PPT还需要找模板?用这招3分钟就能自动排好PPT!
  6. 作者:胡清华(1976-),男,博士,天津大学计算机科学与技术学院教授。
  7. sqlserver 2012 不允许保存更改 的解决办法 0108
  8. Dameware Mini Remote Control 连接记录恢复
  9. HTML5 Canvas中绘制线段
  10. 三款最安全的Linux操作系统(适合从事网络安全工作者使用)
  11. HDU2176 取(m堆)石子游戏【Nim博弈】
  12. 有了这个开源项目,再也不怕去BAT和字节跳动面试考算法了
  13. 微信小程序template模板使用
  14. ROS主从机通信经验总结
  15. switch系统升级无法连接服务器失败,switch更新无法连接服务器(图文)
  16. 零基础的学习者应该怎么开始学习呢?Python核心知识学习思维分享
  17. html表格边框格式,html设置表格边框样式的方法
  18. 用计算机算平米怎么算,平米换算亩怎么算(平方米换算亩计算器)
  19. 吊打何同学?B 站 UP 主 24 小时肝出 AirDesk 平替,成本 6000!
  20. ORACLE ERP consolidation流程(二)

热门文章

  1. pandas处理大数据的一些小技巧
  2. Hive中JOIN的使用入门
  3. Java多线程(十一)之线程池深入分析(上)
  4. Python常见十六个错误集合,你知道那些?
  5. oracle数据库导入导出expdp/impdp命令详细操作过程
  6. FineBI学习系列之FineBI的Windows里安装步骤(图文详解)
  7. 从零开始编写自己的C#框架(18)——Web层后端权限模块——菜单管理
  8. 解决 jquery.form.js和springMVC上传 MultipartFile取不到信息
  9. oracle EBS grant 您不具有执行当前操作的足够权限。请与您的系统管理员联系。...
  10. centos 下编译 gcc