【问题标题】:signals sent by qtcreator on "stop"qtcreator 在“停止”时发送的信号
【发布时间】:2013-04-09 05:22:49
【问题描述】:

我在 linux 上工作,当我使用 Qt creator IDE 上的“停止”按钮关闭它时,我意识到我的应用程序正在留下守护进程。我想处理这些情况,以便应用程序以与关闭主窗口时相同的方式关闭。要编写处理程序,我需要知道它对应于哪些信号。

【问题讨论】:

  • 我认为应该是 SIGTERM。

标签: linux qt signals qt-creator


【解决方案1】:

深入研究 QtCreator 的代码,我可以看到 QtCreator 在内部使用 QProcess 来启动您的应用程序。红色的“停止”按钮连接到ApplicationLauncher::stop(),它会以两种方式之一终止您的进程,具体取决于它是 GUI 应用程序还是控制台应用程序,但在这两种情况下,Linux 上的结果最终都是相同的。

对于 GUI 应用程序,ApplicationLauncher 调用 QProcess::terminate(),后者又向您的守护程序发送 SIGTERM(在 Linux 上)信号。然后它等待(使用waitForFinished())1 秒,如果到那时守护程序还没有退出,它会调用QProcess::kill(),发送SIGKILL

对于控制台应用程序,ApplicationLauncher 将终止委托给 ConsoleProcess 实用程序类。在 Linux 上,ConsoleProcess::stop() 的作用类似于 GUI 应用程序的 ApplicationLauncher,它首先发送 SIGTERM,然后等待 1 秒,如果尚未终止,则发送 SIGKILL

您可以在此处找到来自 QtCreator 的相关代码:

【讨论】:

  • @Fred 所以相关的代码链接适用于“运行”应用程序——当然,这些块在“调试”应用程序时是无关紧要的。知道相应的停止/终止操作在哪里进行调试吗?也许它只是指示 gdb 以某种方式执行此终止超时操作?
  • 链接不再起作用。适合UNIX相关源码的链接:code.woboq.org/qt5/qt-creator/src/libs/utils/…
【解决方案2】:

短版:你不能

长版:

您可以尝试使用:

http://doc.qt.digia.com/qt/qcoreapplication.html#aboutToQuit

但这不会按预期工作。如果一个进程被强制终止(这是 IDE 中的 stop 所做的,我猜想在 windows http://msdn.microsoft.com/en-gb/library/windows/desktop/ms686714(v=vs.85).aspx 上使用 TerminateProcess() )然后该进程在它正在执行的任何中间被立即杀死。仅从 Qt 无法处理这些情况。

【讨论】:

    猜你喜欢
    • 2021-04-27
    • 2019-11-16
    • 2020-04-08
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    相关资源
    最近更新 更多