пятница, 27 мая 2011 г.

Почему версия 6 библиотеки общих элементов управления не использует фоновый поток для анимации?

Это перевод Why does the version 6 animation control not use a background thread? Автор: Реймонд Чен.

Многие люди заметили, что элемент управления анимации в версии 6 библиотеки общих элементов управления больше не использует дополнительный фоновый поток для рисования анимации. Вместо этого он работает так, как если бы стиль ACS_TIMER был бы всегда включен, даже если вызывающий его не указывал. Почему так?

Первая причина состоит в том, что фоновый поток не очень-то помогает. Чтобы рисовать прозрачные анимации, циклу рисования нужно запрашивать родителя, на котором лежит элемент управления анимацией, чтобы получить фоновый цвет, что влечёт за собой отправку сообщения-запроса основному потоку пользовательского интерфейса. Соответственно, главный поток с UI должен отвечать на сообщения, чтобы анимация рисовалась корректно. Если главный UI поток перестаёт отвечать на сообщения, то сообщение WM_CTLCOLORSTATIC, отправленное для определения фонового цвета, подвесит поток рисования, и анимация будет тормозить.

Поэтому главному UI потоку нужно обрабатывать сообщения. А раз так, то нет никакой необходимости в фоновом потоке. UI поток может просто запустить таймер и рисовать анимацию сам, отвечая на сообщения таймера.

Вторая причина для отказа от фонового потока - он делал всё ещё только хуже. Другой поток означает больше переключений контекста и больше давления на память, поскольку дополнительный поток требует своего стека и управляющих структур данных. Конечно, это сравнительно слабая причина.

Третья причина состоит в том, что фоновый поток для рисования поощряет использование плохого кода. Использование фонового потока для прорисовки анимации означает, что UI поток может не отвечать на сообщения длительное время - и обычно это ему сходит с рук, потому что это незаметно из-за работающей анимации. В результате фоновый поток поощряет программы не обрабатывать сообщения, потому что "кажется, всё отлично работает". В результате программы перестают поддерживать отзывчивый UI, что приводит к периодическим загадочным подвисаниям в менеджере окон, когда другая программа делает широковещательную рассылку и тормозиться заблокированным окном. Это приводит к росту недовольства пользователей и типичному чувству "Windows - отстой".

Мы делаем этот "отстой" более очевидным, так что программисты, вероятнее всего, заметят, что они делают что-то не так и наконец-то сделают что-то для решения проблемы. Маскировка проблемы с фоновым потоком анимации просто позволила бы проблеме существовать и дальше.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.