rat*_*eak 157
应用程序从 Windows 提供的队列中获取事件。
如果应用程序在一段时间(5 秒)内没有轮询事件队列,例如在进行长时间计算时,则 Windows 假定应用程序已挂起并提醒用户。
为了避免应用程序应该将昂贵的计算推送到工作线程或拆分处理并确保队列定期轮询。
Dav*_*ill 80
如果没有 Windows 的源代码,我们无法确定它在内部做什么。
有一个IsHungAppWindow
可以使用的 SDK Windows 功能。
如果一个应用程序没有等待输入,没有在启动处理中,并且在 5 秒的内部超时时间内没有调用PeekMessage,则认为应用程序没有响应。
如果顶级窗口停止响应消息的时间超过几秒钟,则系统认为该窗口没有响应。在这种情况下,系统会隐藏窗口并用具有相同 Z 顺序、位置、大小和视觉属性的幻影窗口替换它。这允许用户移动它、调整它的大小,甚至关闭应用程序。但是,这些是唯一可用的操作,因为应用程序实际上没有响应。
否。应用程序不会被轮询,但会给予处理器时间。
Windows 有一个调度系统,可以为应用程序线程提供处理器时间。
调度算法很复杂,在Windows Internals, Part 1 (6th Edition) (Developer Reference) 中有完整的描述。
Vik*_*oth 32
实际上,Windows 并不总是知道应用程序没有响应。应用程序必须是一个带有窗口的交互式应用程序,并且在 Windows 断定应用程序没有响应之前,窗口必须接收到应用程序无法处理的消息。
例如,Windows 无法知道从命令行运行的没有用户界面的数字运算应用程序是否正在执行其操作,或者是否陷入无限循环。
Windows 中的交互式图形应用程序通过不断轮询消息队列来接收事件。Windows 使用键盘、鼠标、计时器等事件填充此消息队列。如果应用程序在一段时间内未能轮询消息队列(IsHungAppWindow() 函数文档中提到的超时时间为 5 秒),Windows 会认为应用程序“挂起”,它可能通过更改窗口标题(添加文本“ (Not Responding)”或本地化版本中的等效文本)并在用户尝试与窗口交互时使窗口内容变灰。
应用程序可能会以 Windows 无法识别的方式挂起。例如,应用程序可能会继续轮询其消息队列中的消息,而没有对它们进行适当的操作,因此对于所有实际意图和目的,它会显示为“挂起”,而 Windows 没有意识到它没有响应。
归档时间: |
|
查看次数: |
32620 次 |
最近记录: |