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命令。