WinAPI:在WM_PAINT省略 BeginPaint 和 EndPaint 会导致 100% 的 CPU 使用率



处理wm_paint消息时,我省略了beginpaint和endPaint呼叫,而CPU使用率最高为100%。为什么这是?

我也在使用工人线程...但是它们做了不同的事情,似乎对此事没有影响。

另外,我可以使用getDC()而不是开始paint的设备上下文吗?他们似乎有不同的价值观,所以我认为他们的工作不同。

对不起,如果我听起来像个白痴 - 我是Winapi,C 的新手,而只是逻辑的整个世界...

谢谢

这完全正常。Windows在"不空"中的窗口更新区域时会生成WM_PAINT消息。您所谓的要做的就是再次将其标记为空。例如,您这样做,通过调用begin/endpaint()。

如果您不这样做,则Windows 立即生成了另一个WM_PAINT消息,仍然试图使更新区域清空。您的线程将燃烧100%的核心,闲置处理WM_PAINT消息,而实际上无法完成工作。也许您实际上是在绘画,Windows只是不知道您绘制了什么,也不试图猜测它。

使用begin/endPaint()是完成该工作的理智方法。这不是唯一的方法,您也可以调用有效Paterect()或有效PatergeNgn()。只要您是" Winapi的新手",我强烈建议您以正常方式这样做。

不确定是否是这种情况,但是beginpaint和endPaint也验证了窗口的绘制区域,如果您不使用它们,那么Windows不知道您已经重新划定了此区域。有效的派系功能以告知窗口被重新绘制的事实。

不确定在您的情况下这是否有帮助,您可以在以下情况下阅读更多有关tjis的信息

getDC()和beginpaint()

之间的区别

gdi发出WM_PAINT消息以更新窗口的一部分。BeginPaint/EndPaint()通知GDI,处理程序正在从事这项工作。在没有针对指定区域的beginpaint()的情况下,直到将生成窗口(由某人)WM_PAINT消息更新为止。这就是您在WM_PAINT处理程序中需要BeginPaint/EndPaint()的原因,而在没有看到高CPU利用率的情况下。

getDc()不能替代Begin EndPaint(),因为我上一段中提到的原因。

最新更新