【发布时间】:2012-05-23 04:17:19
【问题描述】:
我在我的应用程序中使用 WS_EX_COMPOSITED 样式,但它运行 CPU 到 100%,有没有办法停止我的应用程序绘图一段时间并仅在我需要时恢复? 有些人建议使用 Sleep,但我究竟应该在 WndProc 中的哪个位置放置 sleep ?
提前致谢。
【问题讨论】:
标签: c++ windows winapi gdi double-buffering
我在我的应用程序中使用 WS_EX_COMPOSITED 样式,但它运行 CPU 到 100%,有没有办法停止我的应用程序绘图一段时间并仅在我需要时恢复? 有些人建议使用 Sleep,但我究竟应该在 WndProc 中的哪个位置放置 sleep ?
提前致谢。
【问题讨论】:
标签: c++ windows winapi gdi double-buffering
不要使用Sleep。这是几乎没有问题的解决方案。
WS_EX_COMPOSITED 确实可以占用 CPU,但根据我的经验,主要是在 XP 上。 Vista 及更高版本对性能的影响要小得多。但是,如果您的应用处于空闲状态,则不会重新绘制。如果您的 CPU 为 100% 并且应用程序处于空闲状态,那么您在处理 WM_PAINT 时做错了。你所描述的听起来像是一个无限循环的油漆循环。如果您做对了,即使您使用WS_EX_COMPOSITED,也不会发生这种情况。
关于进行双缓冲的正确方法,BeginBufferedPaint 是在 Vista 及更高版本上执行此操作的现代方法。
【讨论】:
如果您休眠应用程序的线程,它会使应用程序 UI 无响应。在我看来,您需要在自己的线程中实现绘图代码。然后,您可以休眠该线程而不会影响应用程序的其余部分,但我建议使用事件和 WaitForSingleObject/WaitForMultipleObjects 调用而不是休眠。
【讨论】: