【问题标题】:How to provoke "Application not responding"如何引发“应用程序无响应”
【发布时间】:2019-01-05 02:46:18
【问题描述】:

出于测试目的,我需要编写一个程序,将著名的“应用程序无响应”消息显示在屏幕上。 我不知道我会怎么挑衅。

最快、最简单的方法是什么?最好是 C/C++ 或 Java

【问题讨论】:

  • 尝试一个很长的线程休眠操作。你也可以做一个什么都不做的无限循环,但这可能会被优化掉。不知道它是否会起作用,但这是一个好的开始。
  • 无限循环应该没问题。
  • 到目前为止你尝试过什么?你有任何窗口程序吗?如果您有一个使用 Windows 的程序,您只需要阻止它响应即可。如果您没有这样的程序,则必须找到编写此类程序的入门书,并至少获得基本代码和构建说明。

标签: java c windows visual-c++


【解决方案1】:

在 Windows API 中,GUI 程序通过 messages 从操作系统获取输入,它必须在 message loop 中接收和发送这些消息。发生的任何事情(鼠标移动/单击、按键,以及退出应用程序的请求)都会作为消息传递。

创建每个 window 后,您可以附加一个回调函数来实际处理与该窗口相关的消息(请注意,每个 GUI 元素都是一个 window,例如按钮或文本输入字段)。此回调在 Windows API 中称为 window procedure

当应用程序未能及时处理消息时,操作系统会显示消息“应用程序未响应”。所以在你的代码的某个地方,你只需要停止处理消息来触发它,例如,你可以在你的消息循环或窗口过程中故意进入一个无限循环。

现在,如果您使用 Java 编码或使用 C 中的一些 GUI 工具包(例如 GTK),您将不会编写自己的消息循环和窗口过程,框架/工具包为您提供这些,为您提供抽象更高级别的接口。是否可以引发无响应的应用程序取决于框架的设计。您基本上需要占用“UI Thread”(例如,在通常处理消息的主线程中执行无限循环,因此它无法完成工作)。

如果显示此消息是因为应用程序存在错误,则该错误正在主线程中执行以下操作:a) 无限循环,b) 无限阻塞或 c) 进入死锁。你永远不应该在 win32 应用程序的主/UI 线程中做一些不能立即完成的事情。或者,更一般地说,您不应该在任何 GUI 程序中处理事件/处理消息的线程中执行类似的操作。

【讨论】:

    猜你喜欢
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    相关资源
    最近更新 更多