WinAPI:省略BeginPaint& WM_PAINT中的EndPaint导致100%的CPU使用率

时间:2014-01-25 18:21:13

标签: c++ windows winapi wm-paint

当处理WM_PAINT消息时,我省略了BeginPaint和EndPaint调用,并且CPU使用率高达100%。这是为什么?

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

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

对不起,如果我听起来像个白痴 - 我是WinAPI,C ++的新手,只是一般的逻辑世界......

由于

3 个答案:

答案 0 :(得分:8)

这是完全正常的。当窗口的更新区域为非空时,Windows会生成WM_PAINT消息。 所谓的要做的就是将其标记为空。例如,您可以通过调用Begin / EndPaint()来执行此操作。

如果不这样,那么Windows 会立即生成另一个WM_PAINT消息,仍然会尝试清空更新区域。您的线程将刻录100%核心,无所事事地处理WM_PAINT消息,而不是实际完成工作。也许你实际上在绘画,Windows只是不知道你画的是什么,也不会试图猜测它。

使用Begin / EndPaint()是完成这项工作的理智方式。它不是唯一的方法,您也可以调用ValidateRect()或ValidateRgn()。只要你是“winapi的新手”,我就强烈建议你以正常方式这样做。

答案 1 :(得分:3)

不确定是否是这种情况,但是beginpaint和endpaint也验证了窗口的绘制区域,如果你不使用它们,那么windows不知道你重新绘制了这个区域。你可以调用ValidateRect函数来告知这个事实窗口被重新绘制。

不确定这对您的情况是否有帮助,您可以在以下内容中阅读更多关于tjis的内容

Difference between GetDC() and BeginPaint()

答案 2 :(得分:1)

GDI发出WM_PAINT消息以更新窗口的一部分。 BeginPaint/EndPaint()通知gdi处理程序正在执行该作业。如果指定区域没有BeginPaint(),则在窗口更新之前(由某人更新)将生成WM_PAINT消息。这就是你在WM_PAINT处理程序中需要BeginPaint/EndPaint()的原因,如果你没有看到高CPU利用率。

由于我之前段落中提到的原因,GetDC()不能替代Begin + EndPaint()。