Qt 进程 QProcess

来源:互联网 发布:商家联盟系统源码 编辑:程序博客网 时间:2024/06/08 11:32

定义

The QProcess class is used to start external programs and to communicate with them.

QProcess类是用来启动一个外部程序并与之通信。

使用说明

开启外部线程的3中方式

To start a process, pass the name and command line arguments of the program you want to run as arguments to start(). Arguments are supplied as individual strings in a QStringList.

Alternatively, you can set the program to run with setProgram() and setArguments(), and then call start() or open().

想要启动一个进程,可以传递你想启动的程序的名字和命令行参数作为参数传递给start()函数。参数作为QStringList中每一个单独的字符串。

或者,你可以通过setProgram()和setArguments()来设置该程序,然后调用start()或者open()启动该程序。

启动时在指定程序名时就附带上参数

QProcess process;process.start("cmd /c ping 127.0.0.1");
  • 1
  • 2

启动时分别指定函数名和参数列表

QProcess process;process.start("cmd", QStringList()<<"/c"<<"ping 127.0.0.1", QIODevice::ReadWrite);
  • 1
  • 2

分别指定函数名和参数,然后再启动

QProcess process;process.setProgram("cmd");process.setArguments(QStringList()<<"/c"<<"ping 127.0.0.1");process.start(QIODevice::ReadWrite);
  • 1
  • 2
  • 3
  • 4

一次性读取进程输出

void readProcessAllOnce(bool processAutoExit) {    qDebug()<<"readProcessAllOnce, processAutoExit ="<<processAutoExit;    qDebug()<<"----------------------";    bool ret;    QProcess process;    QString command;    if(processAutoExit) {        command = "cmd /c ping 127.0.0.1";    } else {        command = "cmd /k ping 127.0.0.1";    }    process.start(command);    /*     * bool QProcess::waitForStarted(int msecs = 30000)     */    ret = process.waitForStarted();    qDebug()<<"waitForStarted"<<ret;    qDebug()<<QDateTime::currentDateTime();    /*     * 如果打开的不是自动关闭的进程,那么这里最多可能会等待30秒     * bool QProcess::waitForFinished(int msecs = 30000)     */    ret = process.waitForFinished();    qDebug()<<QDateTime::currentDateTime();    qDebug()<<"waitForFinished"<<ret;    QByteArray byteArray = process.readAllStandardOutput();    QString str = QString::fromLocal8Bit(byteArray);    qDebug()<<str;    process.close();    qDebug()<<"";    qDebug()<<"======================";}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

这里写图片描述

按行读取进程输出

void readProcessByLine() {    qDebug()<<"readProcessByLine";    qDebug()<<"----------------------";    bool ret;    QProcess process(0);    /*     * cmd /c 的命令执行完后会关闭窗口     * cmd /k 的命令执行完后不会关闭窗口     *     * aa && bb 就是执行aa,成功后再执行bb     * aa || bb 先执行aa,若执行成功则不再执行bb,若失败则执行bb     * a  &  b  表示执行a再执行b,而无论a是否成功     */    process.start("cmd", QStringList()<<"/k"<<"ping 127.0.0.1"<<"&"<<"exit", QIODevice::ReadWrite);//    process.setProgram("cmd");//    process.setArguments(QStringList()<<"/k"<<"ping 127.0.0.1"<<"&"<<"exit");//    process.start(QIODevice::ReadWrite);    ret = process.waitForStarted();    qDebug()<<"waitForStarted"<<ret;    qint64 maxSize = 512;    char buffer[maxSize];    qint64 len;    while(true) {        /*         * 一个waitForReadyRead信号可能输出的是多行         */        ret = process.waitForReadyRead();        qDebug()<<"waitForReadyRead"<<ret;        if(!ret) {            break;        }        while(true) {            len = process.readLine(buffer, maxSize);            qDebug()<<"buffer len"<<len;            /*             * 因为每一行至少还有回车换行符,因此读到0,说明waitForReadyRead超时返回false             */            if(len <= 0) {                break;            }            QString str = QString::fromLocal8Bit(buffer);            qDebug()<<"qstring len"<<str.length();            qDebug()<<str;            qDebug()<<"";        }    }    process.write("exit\r\n");    ret = process.waitForFinished();    qDebug()<<"waitForFinished"<<ret;    process.close();    qDebug()<<"";    qDebug()<<"======================";}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

这里写图片描述

与进程交互

void openProcessThenWrite() {    qDebug()<<"openProcessThenWrite";    qDebug()<<"----------------------";    bool ret;    QProcess *process = new QProcess(QThread::currentThread());    /*     * 如果没有QCoreApplication的话,会报如下错误     * QObject::startTimer: Timers can only be used with threads started with QThread. timer只能在同一个线程中创建和启动.     */    process->start("cmd", QIODevice::ReadWrite);    ret = process->waitForStarted();    qDebug()<<"waitForReadyRead"<<ret;    QByteArray byteArray = process->readAllStandardOutput();    QString str = QString::fromLocal8Bit(byteArray);    qDebug()<<str;    //这里不加换行的话命令发不出去    qint64 len = process->write("ping 127.0.0.1\r\nexit\r\n");    qDebug()<<"write len"<<len;    while(true) {        /*         * 如果进程已经关闭,waitForReadyRead会直接返回false         */        ret = process->waitForReadyRead();        qDebug()<<"waitForReadyRead"<<ret;        if(!ret) {            break;        }        byteArray = process->readAllStandardOutput();        str = QString::fromLocal8Bit(byteArray);        qDebug()<<str;        qDebug()<<"";    }    /*     * 如果没有关闭cmd的指令,因此该process永远不会finished,会超时(30秒)返回false     */    ret = process->waitForFinished();    qDebug()<<"waitForFinished"<<ret;    process->close();    delete process;    qDebug()<<"";    qDebug()<<"======================";}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

这里写图片描述

测试函数

#include <QCoreApplication>#include <QDebug>#include <QProcess>#include <QThread>#include <QDateTime>void readProcessAllOnce(bool processAutoExit) {    ……}void readProcessByLine() {    ……}void openProcessThenWrite() {    ……}int main(int argc, char *argv[]){    QCoreApplication a(argc, argv);    qDebug()<<"======================";    readProcessAllOnce(false);    readProcessAllOnce(true);    readProcessByLine();    openProcessThenWrite();    qDebug()<<"That's all";    return a.exec();}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 卧室门洞太窄了怎么办 刷漆的墙面脏了怎么办 卧室颜色刷重了怎么办 感觉房子买小了怎么办 淋浴房一边是窗怎么办 1岁宝宝让狗咬了怎么办 2岁宝宝让狗咬了怎么办 带4个小孩只买两张儿童票怎么办 墙面补漆颜色有色差怎么办 墙壁刷的乳胶漆颜色不满意怎么办 门被水泡的鼓了怎么办 定制衣柜做大了怎么办 找平的地面高了怎么办 卫生间推拉门锁坏了怎么办 阳台推拉门框安装斜了怎么办? 电子门钥匙坏了怎么办 门的保险锁坏了怎么办 小区楼宇门坏了怎么办 门的锁坏了怎么办 汽车门把锁坏了怎么办 厨柜门上的板板掉了怎么办 衣柜门滑轮坏了怎么办 厨房推拉门推动时有声音是怎么办? 塑料推拉门声音大怎么办不好推 推拉门锁扣坏了怎么办 衣柜移门拉不动怎么办?如何保养 擦黑色桌面有层白灰怎么办 宝宝睡觉不盖被子怎么办 孩子盖被子就哭怎么办 一盖被子就发烧怎么办 两岁宝宝认被子盖怎么办 小孩吃多了发烧怎么办 两岁宝宝拉蛔虫怎么办 吃了长蛆的东西怎么办 被蜱虫咬了又找不到虫子怎么办 木家具生黑虫子怎么办 吃了发霉的面包怎么办 种的韭菜有蛆怎么办 活狗身上长蛆虫怎么办 狗身上会有蛆虫怎么办 狗身上长满了蛆怎么办