我有一个用C ++编写的大型复杂应用程序(没有MFC或.NET)。最积极地使用该软件的客户端将在启动它的一个小时左右内进入所有窗口停止绘画的状态。我们得到报告称应用程序已“挂起”,因为只要他们可以说什么都没有发生。实际上,应用程序正在运行,只是没有显示任何内容。
我尝试了很多不同的事情但无济于事。我没有想法......
答案 0 :(得分:8)
你可能已经预感到了它是什么 - 你在第一句话中把它放弃了
......庞大而复杂的应用......
听起来你某处有GDI资源泄漏。要确认这一点,请尝试在GDI对象的任务管理器中查找您的进程。在某些时候,大多数GDI操作都会因您的应用程序而失败。
确保正确释放所有手柄。请注意,不同的GDI对象需要不同的方法来释放对象。例如GetDC
释放ReleaseDC
,但CreateDC
释放DeleteDC
。
这就是为什么推荐RAII智能对象(如智能指针)用于C ++中的资源管理(其中释放由智能对象管理以减少泄漏和错误的可能性)。
答案 1 :(得分:3)
我敢打赌,应用程序正在泄漏GDI对象,当此进程的GDI专用空间耗尽时,它就无法自行绘制。
您可以通过添加 Windows任务管理器(或任何其他流程管理器,例如 Process Monitor )列 GDI对象来检查是否是这种情况,看看这个数字是否与时间无关。
答案 2 :(得分:0)
您的应用程序实际上可能会遇到被忽略的异常。请参阅Microsoft KB article 976038。