如果程序完成,QProcess exe 不会关闭

Posted

技术标签:

【中文标题】如果程序完成,QProcess exe 不会关闭【英文标题】:QProcess exe does not close if program finished 【发布时间】:2016-09-30 05:35:28 【问题描述】:

我的问题是我在 QProcess 中启动一个可执行文件,如下所示:

QProcess Work;
Work.start(program.exe);

这个可执行文件在后台启动后运行,我可以向它发送请求。如果我完成了,我将通过以下方式关闭可执行文件:

Work.close();

但是如果我查看任务管理器,program.exe 正在进一步运行。我不明白这种行为,因为我认为如果我关闭进程,可执行文件将会停止。

【问题讨论】:

关闭你只是完成了与进程的通信,你并没有杀死它 究竟是什么 program.exe,如果在命令行运行它,你通常如何终止它? program.exe 是一个启动并行线程与另一个 IP 通信的程序。可执行文件确实有一个命令终止,我想我会使用这些命令,因为我发现杀死一个进程非常糟糕。 【参考方案1】:

您应该使用void QProcess::terminate() 或void QProcess::kill()。

terminate() - 尝试终止进程。

kill() - 立即终止进程。

【讨论】:

甚至 terminate() 或 kill() 仅适用于某些程序而不适用于所有程序 在 unix kill() 中发送 SIGKILL 信号。该信号不能被捕获或忽略,并且接收进程在接收到该信号时不能执行任何清理。只有极少数情况下,SIGKILL 不起作用。 我们并不完全了解平台 平台是 windows 7,我也尝试过 kill() 但我听说直接 kill() 或 terminate() 不是一个好主意,因为任何已打开的文件都可以如果我们立即杀死它,则不会被应用程序关闭。 在 Windows 上,terminate() 将 WM_CLOSE 消息发送到进程的所有***窗口,然后发送到进程本身的主线程。因此程序可以保存文件或在必要时提示用户确认。但是当然应该由程序开发者来实现。【参考方案2】:

我有一个非常相似的案例,虽然我正在研究嵌入 QT 4.8 的 linux。不确定这是否可以帮助您,但由于我无法将其放在评论中,因此我必须单独回答。

您是否为 QProcess 设置了父级?就我而言,我像这样实例化了 QProcess

QProcess *p = new QProcess;

我可以在运行进程列表中看到,每次实例化一个新的 QProcess 时,我都会得到一个无法被 close()terminate() 关闭的新进程kill()。当我终于像这样重写代码时

QProcess *p = new QProcess(mainW); //mainW was my GUI class, which handled also the closing of the process

问题自己解决了,我什至不需要调用任何函数来关闭进程。就我而言,我确信我调用的进程正在完成,因为几乎所有这些都是音频文件,所以我可以听到它们正在完成。其他是我的程序等待完成的进程,所以我再次确定它们结束了,因为我的程序没有等待它们,

希望这能有所帮助,尽管操作系统不同。

【讨论】:

以上是关于如果程序完成,QProcess exe 不会关闭的主要内容,如果未能解决你的问题,请参考以下文章

使用 qprocess 运行 .exe

QT软件开发: QProcess启动进程完成交互并获取输出

QProcess 在完成前退出

QT调用外部程序

QProcess精加工的可靠检测

自动更新程序示例