QProcess调用外部程序阻塞等待问题解决

QProcess调用外部程序阻塞等待问题解决

  • 简介
    • 第一种
    • 第二种

简介

在使用QProcess调用外部程序时,可能会遇到两种场景:
1.调用起来之后就不管,直接运行后面的代码
2.调用起来后需要等待外部程序执行完成,在继续运行下面的代码

第一种

这种比较简单,新建一个进程设置好参数就可以了

QProcess *openProcess=new QProcess(this);	//新建一个process进程
//绑定process进程完成信号,垃圾回收
connect(openProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
       [openProcess](int exitCode, QProcess::ExitStatus exitStatus){
     Q_UNUSED(exitCode);
     Q_UNUSED(exitStatus);
     openProcess->close();
     openProcess->kill();
     openProcess->deleteLater();
 });
 command = "需要执行的命令";
 //设置process输出的输出模式
 openProcess->setReadChannelMode(QProcess::MergedChannels);
 //设置工作路径
 openProcess->setWorkingDirectory("工作空间");
 //开始执行
 openProcess->start(command,"需要添加的参数以QstrinfList方式传入");
 //等待系统调度
 openProcess->waitForStarted();

还有一种静态的调用方式,但注意,静态调用方式是阻塞的,要等到进程退出后才会继续执行后面的代码

int QProcess::execute(const QString &program, const QStringList &arguments)

第二种

若调用的外部程序执行完成后不会自动退出,需要用户按任意键才会退出,这时不管是使用静态调用方式还是调用QProcess::waitForFinished(int msecs = 30000)都会浪费大量的时间,waitForFinished默认等待三十秒,超时会自动杀死进程,当参数为-1时一直等待,直到进程结束。我以我遇到的一种情况距离,其他情况可参照
我需要调用的外部程序在执行完成后会输出“press enter key to stop”然后等待用户键入。那么解决思路就是捕捉进程输出,若输出中包含特定字符串时,就视为程序调用完毕

QString command="需要执行的命令" ;
QProcess geomprocess(this);
geomprocess.setWorkingDirectory("工作空间");
geomprocess.start(command);
geomprocess.waitForStarted();
QEventLoop loop;	//创建一个事件循环,等待进程调用完毕
//绑定进程可以读取通道内容信号,当有可以读取的内容时,readyReadStandardOutput信号被发出
connect(&geomprocess,&QProcess::readyReadStandardOutput,this,[&loop,&geomprocess]()
{
	//读取通道内所有内容
    QString data=QString::fromLocal8Bit(geomprocess.readAllStandardOutput());
    //判断读取到的内容是否包含特定字符串
    if(data.contains("press enter key to stop"))
    {
        geomprocess.close();
        geomprocess.kill();
        loop.quit();	//杀死进程,退出事件循环
    }
});
loop.exec();

你可能感兴趣的:(Qt)