【问题标题】:QProcess and shell : Destroyed while process is still runningQProcess 和 shell:进程仍在运行时被销毁
【发布时间】:2013-01-24 14:55:24
【问题描述】:

我想用 Qt 启动一个 shell 脚本。

QProcess process;
process.start(commandLine, QStringList() << confFile);
process.waitForFinished();

if(process.exitCode()!=0)
{
    qDebug () << " Error " << process.exitCode() << process.readAllStrandardError();
}
else
{
    qDebug () << " Ok " << process.readAllStrandardOutput() << process.readAllStrandardError();
}

结果是:

Ok : 结果.... " "" QProcess : 在进程仍然存在时被销毁 正在运行。

此消息并非每次都出现。

有什么问题?

【问题讨论】:

  • waitForFinished() 的超时时间为 30 秒,并返回等待是否超时。所以检查 waitForFinished() 返回值来检查进程是否真的退出了。
  • @FrankOsterfeld 这就是答案。如果您真的想等待该过程完成,我可以添加使用waitForFinished ( -1)
  • 您错过了键入的 readAllStandard。它被写成 Strandard,这不是问题,但如果有人编译会令人困惑。

标签: qt shell qt-creator sh qprocess


【解决方案1】:

process.waitForFinished(); 正在达到默认的 30 秒超时。请改用process.waitForFinished(-1);。这将确保您等待该过程完成所需的时间,而不会出现任何超时。

【讨论】:

    【解决方案2】:

    请注意,您将 QProcess 创建到本地范围内。这意味着当您退出范围时,该对象将被删除。在析构函数中 QProcess 进程终止。当进程在析构函数中终止时,“进程仍在运行”的消息“已销毁”。

    为了解决这个问题,你应该在进程已经终止时调用QProcess的析构函数。

    如果将 QProcess::waitForFinished(-1) 放入您的示例中,它将发生,但这会阻止您的应用程序。

    【讨论】: