WinAPI: пропуск BeginPaint & EndPaint в WM_PAINT приводит к 100% использованию процессора
При обработке сообщения WM_PAINT я пропустил вызовы BeginPaint и EndPaint, и загрузка ЦП возросла до 100%. Почему это?
Я также использую рабочие потоки... но они делают что-то другое и, кажется, не влияют на этот вопрос.
Кроме того, я могу использовать контекст устройства из GetDC(), а не BeginPaint? Кажется, у них разные ценности, поэтому я думал, что у них разные работы.
Извините, если я звучу как идиот - я новичок в WinAPI, C++ и просто в мире логики в целом...
Спасибо
3 ответа
Это совершенно нормально. Windows генерирует сообщение WM_PAINT, когда область обновления вашего окна не пустая. То, что вы должны сделать, это пометить его снова пустым. Вы делаете это, например, вызывая Begin/EndPaint().
Если вы этого не сделаете, Windows немедленно генерирует еще одно сообщение WM_PAINT, все еще пытаясь очистить регион обновления. Ваш поток сожжет 100% ядро, праздно обрабатывая сообщения WM_PAINT и фактически не выполняя работу. Может быть, вы на самом деле рисуете, Windows просто не знает, что вы нарисовали, и не пытается угадать.
Использование Begin / EndPaint () - очень разумный способ выполнить эту работу. Это не единственный способ, вы также можете вызвать ValidateRect() или ValidateRgn(). Пока вы "новичок в winapi", я настоятельно рекомендую вам сделать это обычным способом.
Не уверен, что это так, но beginpaint и endpaint также проверяют нарисованную область окна, если вы не используете их, то windows не знает, что вы перерисовали эту область. Вы можете вызвать функцию ValidateRect, чтобы сообщить о том, что окно было перерисовано.,
Не уверен, что это поможет в вашем случае, вы можете прочитать больше о следующих вопросах, так
GDI выдает сообщение WM_PAINT для обновления части окна. BeginPaint/EndPaint()
сообщает gdi, что обработчик выполняет эту работу. При отсутствии BeginPaint() для указанного региона, до тех пор, пока окно не будет обновлено (кем-либо), будут генерироваться сообщения WM_PAINT. Это причина, почему вам нужно BeginPaint/EndPaint()
в обработчике WM_PAINT и при отсутствии которого вы видите высокую загрузку процессора.
GetDC () не заменяет Begin+EndPaint() по причине, указанной в моем предыдущем абзаце.