QProcess使用思考

我想用QProcess cmd创建几个进程,在一个while循环里,给出一定的判断条件,我希望判断cmd.state(),然后看它如果notrunning或者用它的exitstatus来判断是否正常完成前一个进程,以此决定是否进行下一步。但是我发现,一个问题,如果用while(cmd.status() == QProcess::Running) { ...}的话,永远都会出现the Process has already started的警告。。然后退出。如果用另一种方式,设置一个bool running = true; 然后在processfinished(..)函数里面再赋值为false, 然后while(running){...}的话,程序就会直接死掉。搞不懂啊搞不懂……

      最后,灵感突发,我用qDebug()来测试一下之执行一个进程的情况。结果发现,前面的折腾都是瞎折腾,在on_runBtn_clicked() {...}程序中,不论何处的cmd.status()都是starting,只有当跳出这个函数才执行QProcess进程,然后到达processfinished(...)函数时,cmd.status()就已经是Notrunning了,也就是说,前面的while循环里,根本没有捕捉到process的信号,因为这个信号还在starting,根本没有开始执行。。我百了很多资料,也看了书,就是无法找到根源。最后实在没办法,带着问题睡觉觉。。神奇的是,前天晚上居然半夜里醒来,脑袋里一直盘旋着Qprocess,进程,通信,这个问题…………

       昨天,一怒之下,决定彻底还一种思路来解决这个问题,不就是一个系统嘛,又不是rocket science。突然想到一个办法,既然不能在on_runBtn_clicked() {...}程序中解决掉多个进程的依次调用问题,不如把问题放在processfinished(...)函数中,给类增添一个成员变量作为判定进程队列中是否还有需要执行的步骤,如果没有,就结束调用cmd,如果有,就直接调用下一个进程。如此一来,轻松调试便彻底解决了问题。。oh my ga。。。这恼了我接近一周的问题啊,终于又被我克服了。

       下面又要发一番感慨陈词了:

       其实写程序和对待人生中的困难是一样的,曲径通幽,还一种思维思考问题,或许表面上看起来那并不是最合理的方法,但是往往却能真正解决问题。以后遇到任何问题一定要继续这种策略,一定能让我少走更多弯路。自己

以下贴一点代码备忘(摘自:http://blog.csdn.net/juneman/article/details/6568652),这个童鞋的代码简洁明了,可以解决问题:

connect(&mProcess, SIGNAL(readyReadStandardOutput()), this,    SLOT(redFromStdOut()));
connect(&mProcess, SIGNAL(readyReadStandardError()), this,    SLOT(redFromStdErr()));
connect(&mProcess, SIGNAL(error(QProcess::ProcessError)), this, SLOT(processError(QProcess::ProcessError)));
connect(&mProcess, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(processFinished(int,QProcess::ExitStatus)));

void FloodForecast::redFromStdOut()
{
    ui.textBrowse->append(mProcess.readAllStandardOutput());
}
void FloodForecast::redFromStdErr()
{
    ui.textBrowse->append(mProcess.readAllStandardError());
}
void FloodForecast::processError(QProcess::ProcessError error)
{
    if(error==QProcess::FailedToStart)
    {
        ui.textBrowse->append("<font color=red>程序启动失败.</font>/r/n");
    }
}
void FloodForecast::processFinished(int exitCode,QProcess::ExitStatus exitStatus)
{
    if(exitStatus == QProcess::CrashExit)
    {
        ui.textBrowse->append("<font color=red>程序异常终止.</font>/r/n");
    }
    else
    {
        ui.textBrowse->append("<font color=green>程序正常结束.</font>/r/n");
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值