繁忙的应用程序导致 Windows 7 上出现错误的“无响应”状态 - WM_UPDATE

Posted

技术标签:

【中文标题】繁忙的应用程序导致 Windows 7 上出现错误的“无响应”状态 - WM_UPDATE【英文标题】:Busy Application leads to false "Not responding" state on Windows 7 - WM_UPDATE 【发布时间】:2011-10-23 06:18:09 【问题描述】:

在长期操作过程中,我们的 C++ Win32 应用程序会显示一个带有进程栏的模式状态对话框,每隔几秒左右就会不定期更新。从 Windows 7 开始,我们意识到 Windows 很快就会显示一条消息“似乎挂起...”和/或将“未响应”附加到我们的窗口标题栏。

我们发现进程对话框必须处理消息以避免这种情况。更具体地说,Windows 7 似乎不断发送 WM_UPDATE 消息来检查我们的程序是否处于活动状态。我们以前在此对话框中禁用了所有不需要的消息处理,因为配置文件运行显示它们严重降低了速度。

但尽管我们认为已经解决了问题,但用户再次报告此类问题:Windows 显示“似乎挂起...”和/或将“未响应”附加到我们的窗口标题栏,尽管我们每隔几次处理一次所有事件秒。

问题:

是否有关于 Windows 7(或 Windows vista)中这种行为变化的文档?我们还没有找到。我们还发现了许多其他消息传递行为的变化。

有没有办法从 Windows 禁用所有此类“活动”检查?我们的应用程序运行良好,处理过程可能需要很长时间。

编辑: 更具体地说——我们每隔几秒就会调用消息泵PeekMessage/TranslateMessage/DispatchMessage

由于这是一个相当古老的遗留程序,在不久的将来使用单独的工作线程是不可能的。我们当然会为新代码这样做。另请注意,我的主要观点是 Windows vista / Windows 7 肯定会改变这种行为。我还没有找到任何相关文档。

【问题讨论】:

这需要后台工作线程。 “禁用所有不需要的消息处理” - MSDN在这个主题上非常清楚:“如果[窗口过程]不处理消息,它必须 将消息发送回系统进行默认处理。窗口过程通过调用DefWindowProc 函数来完成此操作。" 【参考方案1】:

嗯,您的问题的直接答案是您可以致电DisableProcessWindowsGhosting()

但是,解决问题的根源比抑制症状要好得多。您的窗口被重影,因为您没有抽出消息队列。您这样做的原因令人钦佩,因为您的应用程序正忙于工作。公认的工作方式和保持队列畅通的方式是在单独的线程中完成工作。

【讨论】:

感谢您的回答。文档说“窗口重影是 Windows 管理器的一项功能,可让用户最小化、移动或关闭没有响应的应用程序的主窗口。”。它没有说明禁用“似乎挂起的音符”。你知道更多吗? 当您禁用重影时,您不会看到任何“(未响应)”文本附加到标题等。 同样从用户体验的角度来看,通过使用不同的线程,您可以使用当前线程向您的用户提供有关其任务进度的反馈。【参考方案2】:

我发现应用程序在主线程中执行阻塞任务时不需要执行实际的消息处理来防止“(未响应)”状态。

只需要定期调用:

PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE);

【讨论】:

以上是关于繁忙的应用程序导致 Windows 7 上出现错误的“无响应”状态 - WM_UPDATE的主要内容,如果未能解决你的问题,请参考以下文章

Windows 7 64上出现0xc000007b错误

IIS 7.0 / Windows Server 2008 上的 ASP.NET MVC 3 应用程序出现 404.0 错误

错误:EBUSY:资源繁忙或锁定,rmdir

操场上的 NSMutableArray 导致 Xcode 7 出现错误

server2008物理内存使用82%导致程序内存错误

IE浏览器提示404 Not Found错误