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

时间:2011-08-09 13:56:51

标签: c++ winapi windows-7 message-queue

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

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

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

问题:

  • 在Windows 7(或Windows Vista)中是否有关于此行为更改的文档?我们还没有发现任何。我们还发现了许多其他消息传递行为的变化。

  • 是否有可能从Windows禁用所有此类“活着”检查?我们的应用程序非常活跃,流程可能需要很长时间。

编辑:更具体一点 - 我们每隔几秒钟才会调用消息泵PeekMessage / TranslateMessage / DispatchMessage

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

2 个答案:

答案 0 :(得分:18)

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

然而,解决问题的根源而不是抑制症状会好得多。您的窗口被重影,因为您没有抽取消息队列。由于您的应用程序忙于工作的令人钦佩的原因,您并没有这样做。可接受的工作方式和保持队列抽取的方法是在单独的线程中完成工作。

答案 1 :(得分:0)

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

它只需要定期调用:

UPDATE