目录
前言
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机制。