【问题标题】:What does « program is not responding » mean?«程序没有​​响应»是什么意思?
【发布时间】:2015-08-16 01:10:12
【问题描述】:

此消息是什么意思,是否有 API 可以“响应”Microsoft Windows 状态查询?

我正在寻找技术答案。谢谢:)

【问题讨论】:

标签: windows winapi windows-process


【解决方案1】:

这意味着程序无法为其消息队列提供服务。来自documentation

如果顶级窗口停止响应消息超过几秒钟,系统会认为该窗口没有响应。在这种情况下,系统会隐藏窗口并用具有相同 Z 顺序、位置、大小和视觉属性的幻像窗口替换它。这允许用户移动它、调整它的大小,甚至关闭应用程序。但是,这些是唯一可用的操作,因为应用程序实际上没有响应。在调试器模式下,系统不会生成幻影窗口。

这通常意味着程序的主线程很忙并且调用GetMessage 的频率不够高。应该在主 UI 线程以外的线程上执行长时间运行的任务。

【讨论】:

  • 足够频繁 = 5s。 IsHungAppWindow (msdn.microsoft.com/en-us/library/windows/desktop/…) 说:如果应用程序没有等待输入,没有在启动处理中,并且在 5 秒的内部超时期限内没有调用 PeekMessage,则认为应用程序没有响应。谢谢。
  • This allows the user to move it, resize it, or even close the application. 我不敢苟同。
  • @b1nary 如果是这样,您应该向 Microsoft 提交错误报告
【解决方案2】:

Windows 应用程序通过接收窗口消息与操作系统交互。这些消息由应用程序在其主线程中循环处理。

如果应用程序未能及时处理其消息(几秒钟是余量),它的消息队列会填满,Windows 将此应用程序标记为“未响应”,使其主窗口呈现白色等。

这种行为主要是由于在处理窗口消息的同一线程上执行冗长的操作引起的。这个线程通常被称为“主 UI 线程”。如果你不做任何显式的多线程,它很可能是你应用程序的唯一线程。

【讨论】:

  • 这不准确。在这种情况下,系统观察到它发送的消息没有得到及时处理。这些消息来自不同的进程,并且不是通过直接调用窗口过程来传递的。因为从不同的过程中这是不可能的。当目标线程调用GetMessagePeekMessageSendMessage等消息分发函数时,会分发跨进程(实际上是跨线程)消息。
  • 你是对的。把事情搞混了。更正了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 2015-04-07
相关资源
最近更新 更多