QProcess进程调用

目录

前言

一、简介

二、 QProcess进程处理

2.1 调用参数设置

2.2 调用外部程序

2.3 同步操作

2.4 与外部程序交互

总结


前言

        QProcess类用于启动外部程序并与它们进行通信,在进程间通信数据量小且调用频次低的情况下,使用QProcess相对简单且实用。


一、简介

二、 QProcess进程处理

        QIODevice继承于QIODevice,它可以启动一个外部程序并与它通讯,并把外部进程看成是一个流类型的I/O设备,并对进程进行读取和写入。

2.1 调用参数设置

设置路径和参数并调用程序

QProcess *pProcess = new QProcess(this);
pProcess->execute("cmd /c ping 192.168.1.1");

2.2 调用外部程序

有三种方法调用外部程序:同步调用、异步调用和分离调用。

1. 同步调用,使用execute方法阻塞当前程序执行,直到外部程序退出。

QProcess *pProcess = new QProcess(this);
pProcess->execute("/user/sbin/dhcpc");

 2. 异步调用,使用start方法调用当前程序,并立即返回。

QProcess *pProcess = new QProcess(this);
pProcess->start("/user/sbin/dhcpc");

3. 分离调用,使用startDetached方法调用当前程序,并与当前程序独立运行。

QProcess *pProcess = new QProcess(this);
pProcess->startDetached("/user/sbin/dhcpc");

2.3 同步操作

异步或分离调用后,可以调用waitForStarted方法来阻塞,直至调用完成。

if (!pProcess->waitForStarted()) {
    // Execution completed or failed
    ...
}

如果需要同步读取数据,则可以调用waitForReadyRead方法来阻塞,直至有数据可读取。

if (pProcess->waitForReadyRead()) {
    // Data available for reading
    ...
}

2.4 与外部程序交互

        在输入输出方面,QProcess将一个进程看做一个流类型的I/O设备,可以像使用QTcpSocket读写流类型的网络连接一样来读写一个进程。可以通过QIODevice::write()函数向所启动进程的标准输入写数据,也可以通过QIODevice::readAll()、QIODevice::readLine()和QIODevice::getChar()函数从这个进程的标准输出读数据。

1. 向外部程序输入数据

QProcess * process = new QProcess(this);

process->setReadChannel(QProcess::StandardOutput);
process->setProgram("C:\\Windows\\System32\\notepad.exe");

connect(process, &QProcess::readyReadStandardOutput, [process]() {
    std::cout << process->readAllStandardOutput().toStdString();  
});

connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), [&](int exitCode, QProcess::ExitStatus) {
    std::cout << "exited"  << std::endl;
});

process->start("cmd");
process->waitForStarted();

process->write("ping 127.0.0.1\r\n");

2. 读取外部程序的输出

QProcess * process = new QProcess(this);

process->setReadChannel(QProcess::StandardOutput);
process->setProgram("C:\\Windows\\System32\\notepad.exe");

connect(process, &QProcess::readyReadStandardOutput, [process]() {
  std::cout << process->readAllStandardOutput().toStdString();  
});

connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), [&](int exitCode, QProcess::ExitStatus) {
    std::cout << "exited"  << std::endl;
});

process->start("cmd /c ping 127.0.0.1");
process->waitForStarted();

总结

        QProcess类使用时相对简单,可直接访问C函数且移植性好。但是,若需要与其它进程复杂通信,则建议使用共享内存或其它IPC机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值