【问题标题】:QProcess returns exit code yet doesn't exit?QProcess 返回退出代码但不退出?
【发布时间】:2015-11-18 06:29:52
【问题描述】:

我本来打算用QProcess在我的电脑上执行一个程序(.exe),处理一个已经存在的文件,然后输出一个新文件继续下一步,整个过程大约需要3到5秒。

但是,虽然执行进程的进程屏幕确实显示并运行,并且我还编写了几行代码来检测进程是否已完成,然后执行下一步,但仍不能阻止项目执行无需等待即可执行以下步骤。

换句话说,我的项目将尝试打开一个不存在的文件,因为它在前面的代码中仍在处理中。

于是我写了一个简单的代码来测试:

QProcess *proc = new QProcess(this);
ui->textEdit->append(QString("%1").arg(proc->state()));
ui->textEdit->append(QString("%1").arg(proc->exitCode()));
ui->textEdit->append(QString("%1").arg(proc->waitForStarted()));
ui->textEdit->append(QString("%1").arg(proc->waitForFinished()));
proc->startDetached("cmd");
ui->textEdit->append(QString("%1").arg(proc->state()));
ui->textEdit->append(QString("%1").arg(proc->exitCode()));
ui->textEdit->append(QString("%1").arg(proc->waitForStarted()));
ui->textEdit->append(QString("%1").arg(proc->waitForFinished()));

结果全是“零”。

0
0
0
0
0
0
0
0

但是 cmd.exe 控制台就在那里,

我对 QProcess 的 exitcode 函数有误解吗?

【问题讨论】:

    标签: qt qprocess


    【解决方案1】:

    问题是您将“即发即弃”API startDetached 与在 QProcess 实例上工作的阻塞(非事件循环)waitFor 方法混合在一起。

    如果要编写阻塞代码,请使用start() 启动进程运行,而不是分离版本。

    当然,对于生产代码,您可能希望使用信号和事件循环来完全避免阻塞,但这不是这里的特殊问题。

    【讨论】:

    • 你的回答给了我一个提示,我在QProcess下找到了一个调用“execute”的函数,这就是我想要的。它会阻塞进程直到它完成。
    • 我的理解是 start + waitForFinished 会做同样的事情,但我还没有实际测试过。无论如何,很高兴您有适合您需求的东西。