QProcess 有两种用法模式:
-
一个是调用 start() 或 execute():此时被调用函数的标准输入、标准输出、标准出错 都已经被重定向到QProcess创建的相应的管道中。在这种情况下,即使你的控制台程序有自己的Console,那么它既不能接收任何输入,也不会输出任何内容。改进程的父进程还是咱们自己当前进程,因此,可以管控它。(因此也叫做
可控模式
)
那么,该模式下,如果期望能出现一个本该属于它的控制台窗口,就跟在dev c++等软件编译运行的结果那样,那需要怎么做呢:
加一句代码:
process1.setCreateProcessArgumentsModifier(
[](QProcess::CreateProcessArguments *args) {
args->flags |= CREATE_NEW_CONSOLE;
args->startupInfo->dwFlags &=~ STARTF_USESTDHANDLES;
原理:因为QProcess底层调用的是windows平台的底层库Win32 API 函数 CreateProcess() 来实现创建子进程的,而默认给CreateProcess()函数的参数中,就指明了不要出现控制台窗口,因此我们要想出现控制台窗口,就需要修改默认传给CreateProcess() 函数的参数,就是通过上面的函数实现的。
而且子进程会共用父进程的这个窗口设置属性,比如进程A设置采用显示控制台窗口的形式启动了进程B,输入给B的参数中又是进程C的路径,此时只会出现一个控制台窗口,也就是进程C的内容会显示在进程B的控制台窗口中。
示例代码:
QStringList arguments;
arguments;//
QProcess process1(this);
process1.setCreateProcessArgumentsModifier(
[](QProcess::CreateProcessArguments *args) {
args->flags |= CREATE_NEW_CONSOLE;
args->startupInfo->dwFlags &=~ STARTF_USESTDHANDLES;
process1.start("C:\\Users\\86132\\Documents\\panda_project\\test1.exe"/*,arguments*/);
process1.waitForStarted();
process1.waitForFinished();
参考文献:
QProcess调用外部程序不显示界面 - sagerking - 博客园
QProcess :: startDetached在启动cmd.exe外部程序没有弹出窗口_xinqingwuji的博客-程序员宝宝 - 程序员宝宝
Windows下令QProcess弹出CMD界面_Sudouble的博客-CSDN博客
- 另一个用法是,startDetached():这是QProcess启动你的控制台程序后,没有任何额外的操作,你也在当前程序中无法控制它(它是一个独立的进程了,父进程不是当前进程,因此无法管控它了)。不过,在Windows下,会有一个你期望的Console出现;在其他系统下,不会有终端显示出来。(不可控模式)
- 一般在英文文档中,fine-tune表示微调的意思,比如参数微调
- passing it to表示将参数xx传递给xx,即传递,输入的意思
- custom color scheme,表示自定义配色方案,custom一般表示自定义,比如软件自定义安装选项
参考文献:
Qt之:QProcess使用总结_壁立千仞无欲则刚的博客-CSDN博客_qprocess
terminate(),区别于 kill() 这种暴力的退出不同,它在退出进程的时候是有机会提示用户输入任何为保存的文件等。进程的输出通道与QProcess的读取通道相对应,⽽进程的输⼊通道与QProcess的写⼊通道相对应。这是因为我们使⽤QProcess读取的内容是进程的输出,⽽我们编写的内容则成为进程的输⼊。调⽤start()函数或open()函数启动进程。以分离的方式启动外部程序,外部程序与主程序互不干扰,外部进程的父进程是。的方式启动外部程序,外部进程与主程序互不干扰,但外部进程的父进程就是。
编写一个控制台应用程序,放到CMD中可以运行。
研究了快一下午,来回看了QProcess文档中,关于start、execute、statedDetached相关程序的说明。但通过在被调用程序中插入cout的打印输出观察后,发现运行的程序都是在父进程的cmd中运行。
使用方法
QProcess文档中有一段关于如下函数原型的描述。大意是说明在Windows平台下,QProcess的实现依靠于CreateProcess API,Qt对其进行了封装,如果需要更细粒度的控制,可以使用CreateProc
QProcess可以用于启动外部程序,具有两种方式。
一体式:QProcess::start 方法。
外部程序启动后,将随主程序的退出而退出。 貌似要使用QProcess的close方法才可以关闭启动的外部程序。
分离式:QProcess::startDetached 方法。
外部程序启动后,当主程序退出时并不退出,而是继续运行。
2:当主进程关闭时,被调用的QTcpClientTest.exe 是随着主进程一起退出。3:主进程发送的参数,被调用的QTcpClientTest.exe 依然可以接受。3:主进程发送的参数,被调用的QTcpClientTest.exe 可以接受参数。(1.1)分离式:外部程序启动程序后,主程序退出时,被调用的进程继续执行,不退出。1:使用了startDetached来启动进程,信号都是无效的,接受不到任何消息。2:当主进程关闭时,被调用的QTcpClientTest.exe 是不会退出的。
可用于完成启动外部程序,并与之交互通信。
一、启动外部程序的两种方式
1)一体式:void QProcess::start(const QString & program,const QStringList &arguments,OpenMode mode = ReadWrite)
外部程序启动后,将随主程序的退出而退出
进程的概念
进程是操作系统里的一个概念,所谓进程就是程序执行的时候,会产生程序调度,数据处理等过程,因此一个程序会有多个进程,每个进程有自己独立的数据空间,以允许同时有多位用户执行同一程序,却不会相冲突。
所以引申出一些其他的概念。
进程在执行时,状态(state)会改变。所谓状态,就是指进程目前的动作:
新生(new):进程新产生中。
执行(running):正在执行。
等待(waiting):等待某事发生,例如等待用户输入完成。亦称“阻塞”(blocked)
就绪(ready):排班中,等待CP
Qt提供了QProcess类,QProcess可用于完毕启动外部程序,并与之交互通信。一、启动外部程序的两种方式:(1)一体式:void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite)外部程序启动后。将随主程序的退出而退出。
QProcess启动子进程后,主进程关闭会带着子进程一起关闭,但是如果通过startDetached启动子进程写入的数据将读取不到,大概如此,网络中还包含子进程使用QSocketNotifier关联数据读取,我个人并未尝试成功,后期打算再尝试一下。
QProcess 常被用来启动外部程序,并且可以与之进行通讯。本文总结了开发过程中,QProcess的常用操作,部分内容借鉴网上。
QProcess启动外部程序,并获取其输出信息
首先新建一个外部程序(QtConsole.exe),供QProcess调起使用,其代码如下:
#include <QtCore/QCoreApplication>
#include <QDebug>
#include <iostream>
int main(int argc, char *ar