【问题标题】:Does command line windows restart gracefully exit running app命令行窗口是否正常重启退出正在运行的应用程序
【发布时间】:2015-05-31 14:38:01
【问题描述】:

平台:Windows 2008 服务器

遇到了一个问题,我使用 pyinstaller 生成的单文件 exe 无法清除其关联的临时文件夹。阅读有关此http://pythonhosted.org/PyInstaller/ 的信息,并发现如果 exe 没有正常关闭,它不会删除其关联的临时文件夹。在此之后,我与设置 exe 的 IT 人员交谈,并被告知该应用程序在系统启动时启动,并且每晚都会发生系统重启。

我尝试确定 Windows 上的系统重新启动是否会正常退出正在运行的应用程序,但找不到任何相关信息。

有谁知道 Windows 是否会通过计划的系统重启优雅地退出正在运行的应用程序?

提前致谢

【问题讨论】:

  • 作为一般规则,您不能依赖始终能够干净退出的应用程序。在这种情况下,您可能应该在下次启动应用程序时清除临时文件夹。
  • 就像反馈一样。我不得不向应用程序添加一个清理脚本。重新启动有时不允许应用程序正常退出,这就是 pysinstaller 没有运行它应该运行的清理例程的原因。

标签: windows python-2.7 pyinstaller


【解决方案1】:

是的,确实如此,但是implementation slightly differs between XP\Vista。您还可以更改关机计时器和自动关闭行为:How to Specify WaitToKillAppTimeout to Speed Up Shut Down Time in Windows

在 Windows XP 中:

在 Windows XP 中,每个正在运行的应用程序都会发送 WM_QUERYENDSESSION 关机时的消息。应用程序可以返回 TRUE 以表明 它们可以被关闭,或者 FALSE 表示它们不应该被关闭 关闭(例如,因为这样做会导致用户丢失数据或 销毁正在刻录的 CD)。如果应用程序返回 FALSE,在大多数情况下 情况下,关机将被取消(以及取消的应用程序 关机发送 WM_ENDSESSION 与 wParam == FALSE)。

应用程序还可以按顺序延迟响应 WM_QUERYENDSESSION 显示 UI,询问用户想要做什么。例如,当 记事本中有未保存的数据并显示“您想保存您的 数据?”关闭期间的对话框,这就是它正在做的事情。默认情况下, 应用程序最多可以延迟响应 WM_QUERYENDSESSION 5 秒。 5 秒后,Windows XP 将显示一个对话框, 表示应用程序没有响应并允许用户 终止它。在用户响应此对话框之前,应用程序 可以阻止 WM_QUERYENDSESSION (因此,关闭) 无限期。

在 Windows Vista 中

用户强制关闭的能力
在 Windows XP 中,用户界面 阻止应用程序允许用户取消关机或 终止阻塞应用程序。如果后续申请也 阻止关闭,系统为每个阻止显示相同的 UI 应用。这让许多用户感到沮丧,他们在关闭时 下来,“只想”他们的电脑关闭。 Windows Vista 将 通过允许用户终止阻塞应用程序来解决这个问题 使关机“有力”。在强制关闭时,Windows 将发送 带有 ENDSESSION_CRITICAL 标志的应用程序 WM_QUERYENDSESSION。如果 应用程序响应 FALSE,Windows 将继续关闭 取消它,并将发送应用程序 WM_ENDSESSION。如果 应用程序超时响应 WM_QUERYENDSESSION 或 WM_ENDSESSION,Windows 将终止它。

将不再允许静默关闭取消
在 Windows XP 中, 允许应用程序在不显示的情况下否决 WM_QUERYENDSESSION 任何指示他们为什么需要取消关机的 UI。这些“沉默 关机失败”对用户来说是非常令人沮丧的,他们经常采取 一两分钟意识到关闭失败,因为没有 UI 显示。 Windows Vista 将通过显示 UI 即使应用程序否决 WM_QUERYENDSESSION。

某些类型的应用程序将不再被允许阻止 关掉。关机时,Windows Vista 会检查是否每次运行 应用程序没有响应(应用程序被定义为没有 如果它没有响应它的任何窗口消息,则响应 最后 5 秒),如果是,则自动终止它。

Windows Vista 也不允许控制台应用程序或应用程序 没有可见的顶级窗口来阻止关机。在大多数情况下 在这种情况下,此类应用程序在关机时对用户的重要性不如 具有可见顶级窗口的应用程序。如果一个应用程序 没有可见的顶级窗口通过否决阻止关闭 WM_QUERYENDSESSION,或者需要超过 5 秒才能响应 WM_QUERYENDSESSION 或 WM_ENDSESSION,Windows 会自动 终止它。

但是,如果没有可见顶级窗口的应用程序使用 新的 API 主动指示它需要阻止关机, Windows Vista 不会自动终止它,而是会 将其视为具有可见顶层的应用程序 窗口。

【讨论】:

  • 如果 OP 有控制台程序,值得注意的是交互式控制台程序通常不会收到此通知。通常只有服务器本身(例如 conhost.exe)获取窗口消息。它在客户端中注入一个线程来为注销和关闭事件运行已注册的处理程序。根据文档,只有作为服务运行的程序才能看到这些事件,但服务也可以注册一个处理程序,以便服务控制器通知会话更改和关闭。
猜你喜欢
  • 2011-07-02
  • 2012-01-03
  • 2019-08-10
  • 2023-04-04
  • 2020-02-06
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多