WS_EX_COMPOSITED — высокая загрузка ЦП

Я использую стиль WS_EX_COMPOSITED в своем приложении, но он загружает ЦП на 100%, есть ли способ остановить рисование моего приложения на некоторое время и возобновить его только тогда, когда мне нужно? Некоторые люди предлагают использовать Sleep, но где именно в WndProc я могу поместить Sleep?

Заранее спасибо.


person VisaToHell    schedule 15.05.2012    source источник


Ответы (2)


Не используйте Sleep. Это решение практически любых проблем.

Это правда, что WS_EX_COMPOSITED может загружать процессор, но, по моему опыту, в основном на XP. В Vista и более поздних версиях наблюдается гораздо менее значительное снижение производительности. Однако, если ваше приложение бездействует, оно не будет перерисовываться. Если ваш ЦП загружен на 100%, а приложение простаивает, значит, вы делаете что-то не так в своей обработке WM_PAINT. То, что вы описываете, звучит как бесконечный цикл циклов рисования. Если вы все сделаете правильно, этого не произойдет, даже если вы используете WS_EX_COMPOSITED.

Что касается правильного способа двойной буферизации, BeginBufferedPaint это современный способ сделать это в Vista и выше.

person David Heffernan    schedule 15.05.2012

Если вы заснете поток приложения, пользовательский интерфейс приложения перестанет отвечать на запросы. Мне кажется, что вам нужно реализовать свой код рисования в своем собственном потоке. Затем вы можете перевести этот поток в спящий режим, не затрагивая остальную часть вашего приложения, хотя я рекомендую использовать события и вызовы WaitForSingleObject/WaitForMultipleObjects вместо спящего режима.

person pnswdv    schedule 15.05.2012