QProcess::execute()调用pingIp时窗口闪烁问题

实现一个多次pingIp功能,检验IP是否连接。使用QProcess::execute(QString)调用ping 命令时,发现ping窗口一直弹出闪烁,影响UI使用效果。调用代码为:

QString strIP = "127.0.0.1";
QString strInfo;
strInfo.sprintf("ping %s -n %d -i %d -w %d", strIP.toLocal8Bit().constData(), 2, 10, 200);

QProcess::execute(strInfo);

我们知道 QProcess::execute() 是同步启动新程序,启动程序时会阻塞当前进程,如果是UI线程就会卡住。但是为何会弹出ping窗口?通过QProcess::execute() 的源码我们发现:

int QProcess::execute(const QString &program)
{
    QProcess process;
    process.setReadChannelMode(ForwardedChannels);
    process.start(program);
    
    if(!process.waitForFinished(-1))
        return -2;
    return process.exitStatus() == QProcess::NormalExit? process.exitCode() : -1;
}

发现execute() 的PrcessChannelMode 写死为ForwardedChanels;

常量描述
QProcess::SeparateChannels0QProcess管理正在运行的进程的输出,将标准输出和标准错误数据保存在单独的内部缓冲区中。您可以通过调用setReadChannel()来选择QProcess的当前读取通道。这是QProcess的默认通道模式。
QProcess::MergedChannels1QProcess将正在运行的进程的输出合并到标准输出通道(stdout)中。标准错误通道(stderr)不会收到任何数据。正在运行的进程的标准输出和标准错误数据是交错的。
QProcess::ForwardedChannels2QProcess将正在运行的进程的输出转发到主进程。子进程写入其标准输出和标准错误的任何内容都将写入主进程的标准输出和标准错误。
QProcess::ForwardedErrorChannel4QProcess管理正在运行的进程的标准输出,但将其标准错误转发到主进程。这反映了命令行工具作为过滤器的典型用法,其中标准输出被重定向到另一个进程或文件,而标准错误被打印到控制台以用于诊断目的。(这个值是在Qt 5.2中引入的。)
QProcess::ForwardedOutputChannel3ForwardedErrorChannel的补充。(这个值是在Qt 5.2中引入的。)

通过表中描述,我们就发现原因了:QProcess::execute 将 pingIP的输出窗口转发到主进程了,所以一直有窗口闪烁。

这里我们设置 process.setReadChannelMode(ForwardedChannels); 通过重新封装一个新的execute() 函数,避免窗口闪烁问题。由于调用了 waitForFinished(-1) 函数,UI可能会卡顿,想避免UI卡顿就只能重新开个线程实现pingIp操作了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值