避免 QProcess 被杀死 (QProcess: Destroyed while process is still running)

Posted

技术标签:

【中文标题】避免 QProcess 被杀死 (QProcess: Destroyed while process is still running)【英文标题】:Avoid QProcess being killed (QProcess: Destroyed while process is still running) 【发布时间】:2021-02-26 07:17:00 【问题描述】:

我试图运行这段代码:

QProcess process;
process.setWorkingDirectory("D:\\Programs\\Qt\\Units\\MyJavaProjects\\StackExp\\target");
process.setProgram("java.exe");
process.setArguments("-jar","StackExp-1.0-SNAPSHOT.jar");
process.start();

并且 cmd 不会打开,也不会执行。它只是显示这条消息:

QProcess: Destroyed while process ("java.exe") is still running

请问,谁知道怎么回事?以及如何在 QProcess 中使用 cmd 运行我的 .jar 文件?

【问题讨论】:

【参考方案1】:

您可能在完成之前调用了destructor of QProcess,这会杀死文档中提到的进程。请注意,当process 超出范围时会调用析构函数。

存在不同的解决方案:

    等待进程完成:waitForFinished

    process.waitForFinished (-1); // -1 = no time out
    

    在堆栈上构造QProcess

    QProcess *process = new QProcess();
    ...
    

    请注意,您应该在完成后销毁该进程以避免内存泄漏。在构造期间指定 parent 可能有助于自动管理 QProcess 的生命周期。

    以分离模式启动进程:startDetached

    ...
    process.startDetached ();
    

    如果调用进程退出,分离的进程将继续运行,不受影响。

    也可以使用QProcess::startDetached 的静态重载。

【讨论】:

以上是关于避免 QProcess 被杀死 (QProcess: Destroyed while process is still running)的主要内容,如果未能解决你的问题,请参考以下文章

QProcess::startDetached shell 在父进程死亡时被杀死,如果父进程是一个 systemd 服务

如何杀死由 Qt QProcess 运行的 MATLAB 批处理?

Qt:如何连接“DialogClass1”的 QPushButton 来杀死“Class2”中的 QProcess?

QT使用QProcess类,判断某个进程是否存在

QT使用QProcess类,判断某个进程是否存在

如何使用 QProcess 避免 waitForStarted 以阻止 GUI 冻结?