Qt如何避免“QProcess:在进程仍在运行时被销毁”的警告?

4

最简单的代码:

void test
{
    QProcess p;
    p.start("sleep 10");
    p.waitForBytesWritten();
    p.waitForFinished(1);
}

当然,在函数结束之前无法完成该过程,因此会显示警告消息:
 QProcess: Destroyed while process ("sleep") is still running.

我希望这条信息不会被显示出来 - 在函数结束前,我应该自己销毁进程,但是我找不到正确的方法:p.~QProcess(), p.terminate(), p.kill() 都不能帮我。注意:我不想等待进程执行,只想在运行时自己终止它。

为什么p.terminate()和p.kill()无法帮助你? - vahancho
int main() { QProcess prc; prc.start("sleep 10"); prc.waitForBytesWritten(); prc.waitForFinished(1); prc.terminate(); prc.kill(); return 0; } // 仍有警告 - Konstantin Ivanov
1个回答

9
你可以根据你的意愿显式地杀死或终止进程。然而,这还不够,因为实际上你需要等待进程终止。在Unix上,“kill”意味着它会向进程发送SIGKILL信号,并且实际完成需要一点时间。因此,你可以编写类似下面的代码:

main.cpp

#include <QProcess>

int main()
{
    QProcess p;
    p.start("sleep 10");
    p.waitForBytesWritten();
    if (!p.waitForFinished(1)) {
        p.kill();
        p.waitForFinished(1);
    }
    return 0;
}

main.pro

TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp

这是一个正确的解决方案,帮助我抑制了警告。然而,我建议在 p.waitForFinished(1); 中使用比1毫秒更长的超时时间。在某些情况下,进程终止可能需要更长的时间。我使用-1来表示没有超时时间(相信操作系统会在合理的时间内真正杀死进程)。 - HiFile.app - best file manager

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接