我有一个用 C++(没有 MFC 或 .NET)编写的大型复杂应用程序。最积极地使用该软件的客户端将在启动它的一个小时左右内进入所有窗口停止绘制的状态。我们收到有关应用程序“挂起”的报告,因为据他们所知,没有任何事情发生。实际上,应用程序正在运行,只是没有显示任何内容。
我尝试了很多不同的东西都无济于事。我没主意了...
我有一个用 C++(没有 MFC 或 .NET)编写的大型复杂应用程序。最积极地使用该软件的客户端将在启动它的一个小时左右内进入所有窗口停止绘制的状态。我们收到有关应用程序“挂起”的报告,因为据他们所知,没有任何事情发生。实际上,应用程序正在运行,只是没有显示任何内容。
我尝试了很多不同的东西都无济于事。我没主意了...
你可能已经预感到它是什么——你在第一句话中就给出了它
... 大型、复杂的应用程序 ...
听起来您在某处有 GDI 资源泄漏。要确认这一点,请尝试在任务管理器中为您的进程查看 GDI 对象。在某些时候,您的应用程序的大多数 GDI 操作都会失败。
确保正确释放所有手柄。请注意,不同的 GDI 对象需要不同的释放对象的方法。例如GetDC
被 释放ReleaseDC
,但CreateDC
被 释放DeleteDC
。
这就是为什么建议将 RAII 智能对象(如智能指针)用于 C++ 中的资源管理(其中释放由智能对象管理以减少泄漏和错误的可能性)。
我敢打赌,应用程序正在泄漏 GDI 对象,并且当此进程的 GDI 专用空间用尽时,它就无法再绘制自己了。
您可以通过将GDI Objects列添加到Windows 任务管理器(或任何其他进程管理器,例如Process Monitor )来检查是否是这种情况,并查看该数字是否随时间无限增长。
您的应用程序实际上可能正遭受被忽略的异常。请参阅Microsoft 知识库文章 976038。