QT计算机控制进程,Qt 学习之路 2(69):进程
进程是操作系统的基础之一。一个进程可以认为是一个正在执行的程序。我们可以把进程当做计算机运行时的一个基础单位。关于进程的讨论已经超出了本章的范畴,现在我们假定你是了解这个概念的。
在 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):进程相关推荐
- 《Qt 学习之路 2》
Home / Qt 学习之路 2 / <Qt 学习之路 2>目录 <Qt 学习之路 2>目录 序 Qt 前言 Hello, world! 信号槽 自定义信号槽 Qt 模块简介 ...
- 转载: Qt 学习之路 2归档
Qt 学习之路 2归档 http://www.devbean.net/2012/08/qt-study-road-2-catelog/
- 对QT学习之路12-14的源代码补充与修正
QT学习之路12-14的源代码有些不完整,为了更好的让大家学习,本人做了一点修正与补充,谢谢.源代码如下: 头文件: #ifndef MAINWINDOW_H #define MAINWINDOW_H ...
- c gui qt 4编程第二版_我的QT5学习之路(一)——浅谈QT的安装和配置
一.前言 说到Qt,不能不说到C++,这门伟大的语言.因为其面向对象的编程思想和陡峭的学习曲线,一开始学习起来很是吃力.Qt从QT4开始基本封装了很多C++的工具库和界面库,而且支持跨平台,这是它最大 ...
- java qt gui_工控编程,Qt 学习之路
原标题:工控编程,Qt 学习之路 Qt 是一个著名的 C++ 库--或许并不能说这只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI.使用 Qt,在一定程序上你获得的是一个"一站 ...
- Qt学习之路_12(简易数据管理系统)
原文地址为: Qt学习之路_12(简易数据管理系统) 前言 最近从大陆来到台湾,之间杂事很多,挤不出时间来更新博客- 这次主要是通过做一个简易的数据库管理系统,来学习在Qt中对数据库,xml,界面的各 ...
- QT学习之路2 学习笔记
QT学习之路2 学习笔记 1.Qt 是一个著名的 C++ 应用程序框架.你并不能说它只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI 组件.使用 Qt,在一定程度上你获得的是一个&quo ...
- alin的学习之路:Qt与多线程
alin的学习之路:Qt与多线程 如果程序在进行复杂的逻辑处理过程中, 对窗口进行操作, 就会出现无响应的情况. 如何解决这样的问题与高并发的问题? 需要使用多线程. 方式1 特点:简单 创建一个自定 ...
- QT学习之路(一)ubuntu 18.04的Qt Creator在线安装
文章目录 前言 一.准备工作 二.安装步骤 参考链接 前言 Qt是嵌入式开发的必备工具之一,在Linux下安装尤其重要. Qt是C++的一个库,或者说是开发框架,里面集成了一些库函数,提高开发效率. ...
最新文章
- css 伪元素::after与::before的使用
- Linux版本之redhat9---gFtp中文乱码解决方案
- 利用相机SDK采相转换至HImage
- 计算机科学与导论期末论文,计算机科学与导论论文3
- 自动点击器一秒200_做PPT还需要找模板?用这招3分钟就能自动排好PPT!
- 作者:胡清华(1976-),男,博士,天津大学计算机科学与技术学院教授。
- sqlserver 2012 不允许保存更改 的解决办法 0108
- Dameware Mini Remote Control 连接记录恢复
- HTML5 Canvas中绘制线段
- 三款最安全的Linux操作系统(适合从事网络安全工作者使用)
- HDU2176 取(m堆)石子游戏【Nim博弈】
- 有了这个开源项目,再也不怕去BAT和字节跳动面试考算法了
- 微信小程序template模板使用
- ROS主从机通信经验总结
- switch系统升级无法连接服务器失败,switch更新无法连接服务器(图文)
- 零基础的学习者应该怎么开始学习呢?Python核心知识学习思维分享
- html表格边框格式,html设置表格边框样式的方法
- 用计算机算平米怎么算,平米换算亩怎么算(平方米换算亩计算器)
- 吊打何同学?B 站 UP 主 24 小时肝出 AirDesk 平替,成本 6000!
- ORACLE ERP consolidation流程(二)
热门文章
- pandas处理大数据的一些小技巧
- Hive中JOIN的使用入门
- Java多线程(十一)之线程池深入分析(上)
- Python常见十六个错误集合,你知道那些?
- oracle数据库导入导出expdp/impdp命令详细操作过程
- FineBI学习系列之FineBI的Windows里安装步骤(图文详解)
- 从零开始编写自己的C#框架(18)——Web层后端权限模块——菜单管理
- 解决 jquery.form.js和springMVC上传 MultipartFile取不到信息
- oracle EBS grant 您不具有执行当前操作的足够权限。请与您的系统管理员联系。...
- centos 下编译 gcc