
Лично у меня установлен одноцветный фон. Он был стандартным в Windows 951, и с тех пор я не расстаюсь с этим голубовато-зелёным цветом. Он меня успокаивает.
Поэтому представьте моё удивление, когда мне показали статью техподдержки «Экран Welcome может отображаться в течение 30 секунд в процессе входа, если вы установили одноцветный фон в Windows 7 или в Windows Server 2008 R2». Почему вход выполняется медленнее с одноцветным фоном?
После аутентификации входа Windows приступает к подготовке рабочего стола. При этом выполняется множество разных процессов: создаётся панель задач, загружаются и инициализируются компоненты, отвечающие за различные системные сервисы, создаётся и заполняется значками окно рабочего стола, окно фона рабочего стола загружает обои рабочего стола и выводит их на экран.
Система входа дожидается, пока все эти элементы сообщат о своей готовности или пройдёт 30 секунд, после чего она переключается с экрана Welcome.
Из этой схемы можно понять причину 30-секундной задержки: она означает, что одному из элементов не удалось сообщить о своей готовности. Допустим, код выглядит примерно так:
InitializeWallpaper()
{
if (картинка обоев задана)
{
LoadWallpaperBitmap();
}
}
LoadWallpaperBitmap()
{
находим картинку на диске
загружаем её в память
выводим её на экран
Report(WallpaperReady);
}
Сообщающий о готовности обоев код находится внутри кода картинки обоев, то есть если картинки нет, сообщение не создаётся и система входа впустую ожидает отчёта, который никогда не придёт.
В той же статье есть упоминание другой статьи, в которой говорится, что если включена групповая политика «Скрывать значки рабочего стола», то тоже может возникнуть 30-секундная задержка.
Групповые политики подвержены этой проблеме, потому что обычно их добавляют уже после написания основного кода. Если нужно добавить групповую политику, мы находим соответствующий код и окружаем его огромным условием «если разрешено политикой».
// Первоначальный код
InitializeDesktopIcons()
{
ограничиваемся папкой рабочего стола
создаём список значков
добавляем их на экран
Report(DesktopIconsReady);
}
// Дополненный поддержкой групповой политики
InitializeDesktopIcons()
{
if (значки рабочего стола разрешены политикой)
{
ограничиваемся папкой рабочего стола
создаём список значков
добавляем их на экран
Report(DesktopIconsReady);
}
}
Область видимости блока if
вышла за рамки вызова отчёта, сообщение о готовности не отправляется и система входа остаётся на экране Welcome все 30 секунд.
Стоит отметить, что в обоих случаях не процесс входа растягивается на 30 секунд. Экран Welcome просто продолжает отображаться — это не время, в течение которого все системы сообщают о готовности (в зависимости от производительности конкретной системы это может быть и 5 секунд, и 25 секунд).
Если взглянуть на даты публикации статей, то можно понять, что проблема была устранена в ноябре 2009 года, всего несколько месяцев спустя после выпуска Windows 7 в июле 2009 года.
1 Изначально я не пользовался фонами-картинками, потому что они занимали много памяти, а когда у тебя только 4 или 8 мегабайтов памяти, отдавать три четверти мегабайта просто под обои неразумно.
Кроме того, я стараюсь придерживаться конфигураций по умолчанию, потому что это упрощает создание отчётов о багах. Если в инструкциях по воспроизведению бага написано «установите систему с нуля, а затем выполните такие-то шаги», то он будет устранён с гораздо большей вероятностью, чем баг с инструкцией «установите систему с нуля, измените пятьдесят параметров, а затем выполните такие-то дополнительные шаги». Гораздо проще оправдать устранение бага, влияющего на стандартную конфигурацию, чем того, для возникновения которого нужно, чтобы пользователь изменил параметры с используемых по умолчанию, особенно если эти параметры непрозрачны.