如何编程以防止 Windows "Not Responding" 对话框
How to program to prevent the Windows "Not Responding" dialog
当应用程序未能响应 5 秒 (source) 时,Windows 可以在标题栏中显示“(无响应)”,在某些情况下会显示 "not responding" 对话框:
理想情况下,5 秒以上的执行不应阻塞 main/event-processing 线程,但是是否有一种简单的(例如 MFC C++ 的 1 个内衬)方式与 Windows 通信,即主线程是很忙,不应该被视为要关闭的 "Not Responding" 应用程序?最快的方法是简单地用 PM_NOREMOVE
定期调用峰值 PeekMessage 吗?
不,没有快速破解方法,因为如果您那样使用主线程,您的应用确实没有响应。
在亿万年前的 Windows 3.1 世界中,答案是将您的工作分成持续时间短的块,运行 您 window 的消息程序中的块,以及通过调用 PostMessage
.
从一个块转到另一个块
现在您更新 window 以表明工作正在进行中,生成一个线程并在线程末尾调用一些 PostMessage 等价物,以便您的 window 可以更新自己并返回显示结果。
确实没有办法解决这个问题。对消息泵的任何胡闹都可能导致各种形式的灾难,尤其是在 COM 和其他系统消息处理方面。
不要拖主线
将较长的 运行 任务移动到后台或工作线程,然后轮询未来以完成或让线程 post 向 GUI 返回一条消息以表明它已完成,然后检索要求的结果。
当应用程序未能响应 5 秒 (source) 时,Windows 可以在标题栏中显示“(无响应)”,在某些情况下会显示 "not responding" 对话框:
理想情况下,5 秒以上的执行不应阻塞 main/event-processing 线程,但是是否有一种简单的(例如 MFC C++ 的 1 个内衬)方式与 Windows 通信,即主线程是很忙,不应该被视为要关闭的 "Not Responding" 应用程序?最快的方法是简单地用 PM_NOREMOVE
定期调用峰值 PeekMessage 吗?
不,没有快速破解方法,因为如果您那样使用主线程,您的应用确实没有响应。
在亿万年前的 Windows 3.1 世界中,答案是将您的工作分成持续时间短的块,运行 您 window 的消息程序中的块,以及通过调用 PostMessage
.
现在您更新 window 以表明工作正在进行中,生成一个线程并在线程末尾调用一些 PostMessage 等价物,以便您的 window 可以更新自己并返回显示结果。
确实没有办法解决这个问题。对消息泵的任何胡闹都可能导致各种形式的灾难,尤其是在 COM 和其他系统消息处理方面。
不要拖主线
将较长的 运行 任务移动到后台或工作线程,然后轮询未来以完成或让线程 post 向 GUI 返回一条消息以表明它已完成,然后检索要求的结果。