QProcess 和 shell:进程仍在运行时被销毁

Posted

技术标签:

【中文标题】QProcess 和 shell:进程仍在运行时被销毁【英文标题】:QProcess and shell : Destroyed while process is still running 【发布时间】: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,这不是问题,但如果有人编译会令人困惑。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于QProcess 和 shell:进程仍在运行时被销毁的主要内容,如果未能解决你的问题,请参考以下文章

Qt笔记-QProcess带管道符号运行及获取进程启动时间(Linux)

Qt笔记-QProcess带管道符号运行及获取进程启动时间(Linux)

linux下QT中如何使用QProcess运行linux命令。

QThread:线程仍在运行时被销毁?

Qt QProcess startDetached 无法结束进程(bash 会话)

QThread:在线程仍在运行时被销毁