Почему для открытия меню Windows читает один файл сто тысяч раз?

Автор оригинала: Bruce Dawson
  • Перевод

«Проводник тратит 700 мс на то, чтобы открыть контекстное меню панели задач. 75% этого времени он выполняет 114 801 операцию считывания из одного файла, средний объём считываемых данных 68 байт.

Мне стоит написать пост об этом, или достаточно саркастичного твита?»


За компьютером я работаю быстро, и поэтому меня раздражает, когда приходится ждать завершения операции, которая должна выполняться мгновенно. Постоянной помехой на моём сверхмощном домашнем ноутбуке стало медленное закрывание окон на панели задач. Я нажимаю правой клавишей на значок, жду, пока откроется меню, а затем выбираю «Закрыть окно». Самым медленным в этом процессе должны быть перемещения мыши, но выясняется, что наиболее долгим компонентом оказывается задержка перед появлением меню.

Это напрягало меня уже давно, но я проявлял нехарактерный мне самоконтроль и удерживался от раздражения. Так было до сегодняшнего дня, когда я наконец сорвался и схватился за трассировщик ETW.

Этот пост написан как проверка скоростного блогинга. От момента нахождения проблемы и саркастичного твита о ней до публикации поста прошло примерно 90 минут.

Трассировщик ETW фиксировал, как я нажимаю правой клавишей мыши на панели задач и закрываю два окна «Проводника». Я использовал функцию UIforETW Tracing to file с опциями по умолчанию, получив в результате лог диагностики на 20,9 МБ.

Иногда самое трудное в анализе трассировки заключается в поиске места возникновения проблемы, но в данном случае эта часть анализа оказалась тривиальной. Было три недвусмысленных сигнала, указывавших на нужное место, и болезненно очевидный виновник преступления.

Первым сигналом были события ввода. UIforETW содержит интегрированный логгер ввода (достаточно анонимизированный, чтобы я случайно не украл пароли или личную информацию), поэтому мне достаточно было подробно изучить события MouseUp и Button Type со значением 2, соответствующим правой клавише мыши. При этом на временной шкале WPA появляются отметки моментов, когда происходят эти события — см. вертикальные линии на скриншоте:


Это дало мне понять, что когда я отпускаю правую клавишу мыши, то спустя 600 мс происходит смена фокуса окна, что, по моей догадке, соответствует моменту отображения меню. Кроме того, в RuntimeBroker.exe присутствует чёткий блок активности ЦП между событиями отпускания клавиши мыши и смены фокуса окна.

Не доказано, что смена фокуса окна и активность ЦП связаны, но сделав измерения при помощи приложения записи экрана, я увидел, что на отображение меню тратится примерно 660 мс, поэтому я склонен этому доверять.

Следующим шагом будет изучение того, чем занят RuntimeBroker.exe. Хотя CPU Usage (Precise) отлично помогает увидеть, сколько времени ЦП использует процесс, и почему он простаивает, подходящим инструментом для выяснения того, на что тратится время ЦП, является таблица CPU Usage (Sampled). Я внимательно её изучил и быстро обнаружил, что 264 сэмпла приходится на KernelBase.dll!ReadFile:


Поискав ещё немного, я нашёл другие стеки вызовов, которые тоже затрагивали эту функцию, поэтому я нажал правой клавишей мыши и выбрал View Callers-> By Function. Включившийся при этом режим (с инвертированными стеками) показал, что из 899 сэмплов этого процесса 628 сэмплов, или 70%, из разных стеков вызовов проходили через эту функцию:


271 сэмпла в этом потоке не проходили через функцию, а оставшиеся сэмплы (не показаны) находились в других потоках.

Заметьте, что 899 сэмплов в потоке 10 252 обозначают два щелчка мыши, то есть примерно 450 сэмплов или 450 мс (при стандартной частоте сэмплирования 1 кГц) на один щелчок мыши.

Иногда файловый ввод-вывод — это время ЦП


CPU Usage (Sampled) показывает время ЦП, поэтому дисковый ввод-вывод здесь обычно не отображается, ведь в эти моменты поток засыпает и ждёт диск. То, что операции ввода-вывода отображаются как время ЦП, означает, что все считывания пришлись на кэш системы и время ЦП было лишними ресурсами ядра (см. ntoskrnl.exe в первом сэмплированном стеке вызовов), потраченными на получение данных из кэша.

Теперь, когда под подозрение попал файловый ввод-вывод, нам необходимо перейти в Graph Explorer-> Storage-> File I/O. Немного настроив внешний вид столбцов, мы получили следующий впечатляющий результат:


Он сообщает нам, что в потоке 10 252 за два щелчка мыши RuntimeBroker.exe создал 229 604 вызова ReadFile, считав в сумме 15 686 586 байт. То есть в среднем каждый раз считывалось по 68 байт.

Задумайтесь об этом на секунду.

Не забывайте, что это вызовы к операционной системе — вызовы ядра. Это значит, что между RuntimeBroker.exe и этим файлом отсутствует кэширование. На самом деле сам файл имеет длину всего 4 027 904 байт, то есть каждый раз, когда я нажимаю на значок проводника в панели задач, файл считывается 1,9 раза самым медленным из возможных способов.

Подстрекаемый своими читателями, я решил удалить этот файл и теперь меню списка переходов проводника появляются почти мгновенно. Я не рекомендую этого делать, но удаление файла может помочь и вам (ценой потери истории проводника):

%appdata%\Microsoft\Windows\Recent\AutomaticDestinations\f01b4d95cf55d32a.automaticDestinations-ms

Выигрыш от удаления файла показан на этом скриншоте WPA. Тонкие вертикальные линии — это нажатия правой клавиши мыши, а прямоугольники в нижней строке обозначают момент отображения меню. Я удалил файл после первых двух кликов и при последних двух кликах задержка значительно снизилась:

Image

Или же «можно воспользоваться официальным прибамбасом из „Параметров“, чтобы очистить (нажать дважды) или отключить (нажать один раз) списки переходов в меню „Пуск“/панели задач. Чтобы ещё больше повысить скорость, отключите также анимации». Спасибо, Рафаэль!

Похоже, что эту проблему можно решить. Снизив задержку отображения меню панели задач проводника, было бы здорово рассмотреть способы устранения других задержек, чтобы все меню панели задач появлялись мгновенно, а не спустя сотни миллисекунд.

Подведём итог


  • Не вызывайте ReadFile, чтобы прочитать 68 байт. Или, по крайней мере, не делайте это сотню тысяч раз. Меня бесит, когда базы данных выполняют считывание по 4 кибибайта, но этот случай просто удивителен.
  • Надеюсь, кто-нибудь устранит эту проблему, но пока у меня есть обходное решение — удаление проблемного файла.
  • Надеюсь, кто-нибудь возьмётся за исследование и выяснит, почему вообще тормозят контекстные меню. Эй, я ведь даже поделился трассировкой ETW и всем остальным!
  • Отчёт по официальным каналам передан в https://aka.ms/AA60dfg
  • Если вы хотите научиться проводить подобный анализ, тогда скачайте мой инструмент UIforETW и прочитайте туториалы, ссылки на которые выложены здесь
  • Не забывайте, что можно открыть контекстное меню гораздо быстрее (это проще, чем стандартное меню списка переходов), нажав shift+правой клавишей мыши на значки. Я буду пользоваться этим трюком, когда нужно будет закрывать много окон.
  • Обсуждение на Hacker news находится здесь
  • Обсуждение на Reddit находится здесь
  • Темы в Twitter находятся здесь и здесь
Поддержать автора
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 551

    +30
    Ответа на вопрос поста нет =))
    Может, всё же в данном случае это «почему» а скорее в формате «Ну зачем?»
      +5
      Пост — вообще скрытая реклама far manager / total commander :-)
        0
        Да ну — кроме них есть ещё куча разных файловых менеджеров )
          +9
          Но от других Far отличается отсутствием графики, т.е. быстрее отображает большое количество файлов, потребляя при этом меньше ресурсов. Работает в Nano Server.
            0
            Ещё ZTreeWin, например, тоже не графический и быстрый и ресурсосберегающий.
              0
              Вы шутите, наверное?
              В полноэкранном режиме — возможно, а в окне — оно под капотом всё равно графика, хоть и выглядит как эмуляция консольного режима.

              Я чего-то не понимаю в сортах винд, наверное? :(
                0
                Отнюдь. Скопировано из оконного фара. К сожалению, выбрать шрифт Courier нельзя.
                ╔══════ D:\temp ═════╗
                ║x Name │ Name ║
                ║… │ ║
                ╟─────────┴──────────╢
                ║. Up 12.09.19 16║
                ╚ 0 (0/0) ═══ 147 G ═╝
                  +2
                  Комментатор выше говорит о том, что в полноэкранном режиме (по крайней мере в старых виндах, в NT-ветке наверное уже нет, не проверял) оно работает в чисто-текстовом режиме (80x25 или 80x40 например), то есть видеоадаптер переключается реально в text mode и картинка рисуется символами знакогенератора, а если даже консольное приложение типа Far запущено в окне, то текстовый режим _эмулируется_, и по факту идет рисование символов операционной системой (эмулятором терминала) в графическом буфере.
                    +2
                    Да, консоль эмулируется, но под неё используется один раз отрисованный шрифт, нет большого количества уникальных иконок. В итоге затраты на отображение папки с большим количеством файлов существенно меньше.
                      0
                      Именно так, спасибо за формулировку.
                    0
                    Это ж консоль, один в один cmd. Оно и выводит туда обычные символы. Оно, конечно, не текстовый режим монитора, но и не совсем графический.
                    ╔═══════════════ C:\Program Files\Git ═══════════════╗
                    ║x         Name           │           Name           ║
                    ║..                       │                          ║
                    ║bin                      │                          ║
                    ║cmd                      │                          ║
                    ║dev                      │                          ║
                    ║etc                      │                          ║
                    ║mingw64                  │                          ║
                    ║tmp                      │                          ║
                    ║usr                      │                          ║
                    ║unins000.dat             │                          ║
                    ║git-bash.exe             │                          ║
                    ║git-cmd.exe              │                          ║
                    ║unins000.exe             │                          ║
                    ║ReleaseNotes.html        │                          ║
                    ║unins000.msg             │                          ║
                    ║LICENSE.txt              │                          ║
                    ║                         │                          ║
                    ║                         │                          ║
                    ║                         │                          ║
                    ║                         │                          ║
                    ║                         │                          ║
                    ║                         │                          ║
                    ║                         │                          ║
                    ║                         │                          ║
                    ║                         │                          ║
                    ║                         │                          ║
                    ║                         │                          ║
                    ║                         │                          ║
                    ║                         │                          ║
                    ║                         │                          ║
                    ║                         │                          ║
                    ║                         │                          ║
                    ║                         │                          ║
                    ║                         │                          ║
                    ╟─────────────────────────┴──────────────────────────╢
                    ║..                               Up   21.01.19 12:06║
                    ╚═════════ 2 920 402 (7/7) ═══ 772 771 840 ══════════╝
                    C:\Program Files\Git>                                 
                    1Help    2UserMn  3View    4Edit    5Copy    6RenMov  
                      0
                      Если не текстовый и не графический — то какой? :)

                      Под капотом оно все равно же выводит в графику.
            –4
            Богат русский язык! В английском оба вопроса звучали бы как «Why?»
              +11
              А «For what?», «What's the point?» и как минимум еще 2 вопроса вертящихся на языке.
                +8
                Я бы даже сказал 'what for' — так экспрессии больше.
                  0
                  И, скорее всего, правильнее, если понаблюдать за использованием данной конструкции носителями языка в соответствующих ситуациях. Например, тот же «good for» — аналогичен по конструкции.
                +21
                … это он незнания английского.
                0

                Вопрос риторический, потому и нет ответа)

                  0
                  Почему — корректный вопрос, зачем — нет, IMHO
                  +2

                  Прекрасно. Напомнило про алгоритм Шлемиэля в Windows Update. Ссылку уже, к сожалению, не найду.

                  –48
                  Хотелось бы узнать национальность разработчика MS, написавшего подобный говнокод.
                  Ещё сильнее хотелось бы подвесить кое-за что разработчиков, тетсировщиков и менеджеров, ответственных за разработку оснастки просмотра логов. Почему она ВСЕГДА тормозит, даже на мощнейших машинах? Примеров много можно привести, кстати. Гнилая система контроля качества, такая же система обратной связи. Баги, несуразности, тормоза в продуктах MS не чинятся ДЕСЯТИЛЕТИЯМИ, проблемы есть у многих, что отражено на официальных форумах компании — но MS класть хотела. И ведь, что характерно, процветают! Ну, а зачем тогда напрягаться.
                    +15
                    Проблема по проявлению похожа на типичную ошибку новичка в вебе с N+1 запросом. Нужно выбрать 100 продуктов из б/д — вываливаем 100 запросов на получение цены, 100 запросов на получение кол-ва в корзине покупателя, 100 запросов на получение информации о товаре и т.д. Причиной этому обычно служат неудачные абстракции, когда возвращает некий объект класса, который на каждый свой метод дёргает соединение с бд. Не удивлюсь если здесь нечто подобное, только дёргается не бд, а файл с логами.
                      +6
                      Причиной этому обычно служат неудачные абстракции, когда возвращает некий объект класса, который на каждый свой метод дёргает соединение с бд.

                      Скорее непонимание какие действия происходят за этими абстракциями.
                        +3
                        Если раскрутить всю цепочку, то получаем примерно следующее:
                        1) Непонимание того, что происходит за абстракциями;
                        2) Кривые абстракции;
                        3) Отсутсвие кеширования;
                        Что в свою очередь возможно при:
                        4) Отсутствие код-ревью;
                        5) Отсутствие опытного архитектора;
                        6) Отсутствие профилирования приложения;
                        7) Плохо проработанный этап тестирования;
                        Что в свою очередь растёт из:
                        8) Плохой менеджмент;
                        9) Недостаток финансирования.
                        Ну а это всё уже похоже на типичные проблемы крупных корпораций, которые в каком-то смысле «впадают в детство» из-за необходимости оптимизации расходов времени и денег. И вот тогда появляются такие «детские ошибки», характерные для маленьких проектов.
                          +1

                          Скорее немонимание того, почему не надо нанимать самого дешёвого разработчика.

                        –22

                        Так стандарт — индус :)

                          +38
                          Говнокод есть везде.
                          Осмелюсь заявить, что нет программиста, который хотя бы раз в жизни не коммитил говнокод, которйы потом ушел в продакшн.
                            +8

                            Да уж, есть программисты, которым еще не приходилось коммитить говнокод в продакшен, и тем, кому уже пришлось.

                              +9

                              Да по моему покажи любому(ок, скажем почти любому) программисту его собственный код пяти, ну или максимум десятилетней давности и первая реакция будет "это кто наговнокодил? " или что-то в этом роде :)

                                +17

                                И это хорошо, это говорит о том что разработчик растёт

                                  +6

                                  Ну почему сразу же "кто"? Как будто я не помню автора...

                                    +2

                                    Ок, скажем у меня в такой ситуации обычно первая реакция "кто это наговнокодил?" и уже вторая "зачем я это наговнокодил?" :)

                                      0
                                      третья реакция — ну и дебил же я был тогда
                                      +1
                                      Программист, который помнит свой код через 10 лет, вызывает подозрение…
                                      Можно посчитать, пусть 100 строк кода в день, в месяце в среднем 22 рабочих дня за год будет 26 тыс 400 строк кода. За 10 лет 264 тыс. строк — и как такое можно запомнить.

                                      Хотя может человек уникум и помнит каждый день своего существования начиная с возраста 1 мес…
                                        +1
                                        Может он узнал смешной комментарий или имя переменной?
                                          +2

                                          Я обычно узнаю о том, что это мой код, через git blame. В системе контроля версий все ходы записаны

                                    –5
                                    Вполне возможно, что код нормальный, но не оптимизирован. Ничего страшного нет, если, например, алгоритм выполняет сортировку в файле, а не в памяти, потому что раньше памяти сильно не хватало.
                                    От этого код не становится плохим, просто он был применен в абсолютно дурацкой ситуации.
                                      +3

                                      Легаси код, пронесенный сквозь десятилетия еще со времен вин для мс дос прямо в вин10, которая обновляется раз в 2 дня) звучит очень романтично. Это как вскрыть капсулу времени эпохи Гагарина) Только это остается говнокодом. Именно рациональное и обдуманное использование последовательностей символов превращает их в хороший код. Вы же не скажете, что айфон 3 — хорошая альтернатива топовым смартфонам. Так было когда-то, но сейчас это просто устаревший кирпичик)

                                        +2
                                        Это — вряд ли. Как раз раньше в «тёплые ламповые времена», программеры прекрасно в большинстве своём владели основными алгоритмами ускорения вычислений. Даже школьники (вспоминаю своё детство)! Сейчас поразвелось восторженных мальчиков-программистов-мажоров, к-рые считают, что если они написали несколько тысяч строк говно-кода на каком-нибудь Питоне, то они уже супер-пупер-программеры. На вопрос о «методе пузырька» в большинстве случаев слышишь: «чаво?». А на вопрос об оптимальности кода, получаешь совершенно идиотский ответ типа «а для чего тогда оптимизирующие компиляторы существуют, ты мне ещё предложи на асме писать». В рез-те критерий кач-ва работы программера является исключительно кол-во натоптанных за день на клавиатуре строк как бы работающего кода, а мы, в рез-те, только и успеваем засылать горы денег производителям железа :(
                                          +2
                                          Хуже. Количеством скопипащенных строк со стековерфлоу. И хорошо если стековерфлоу, а то разные бывают источники говнокода…
                                      +28
                                      Неразумность не имеет ничего общего с национальностью.
                                        +13
                                        Напрямую — нет. Опосредованно — через культуру.
                                        Нравится вам это или нет.
                                          +3

                                          Тогда в исходном комменте автору надо было хотеть узнать культуру, а не национальность.

                                            +1
                                            Пруфы будут?
                                              +14
                                              Видимо, в качестве пруфов нужна какая-то статистика. Я такой не знаю. Боюсь, что и подобные исследования — независимо от результата — будут затруднительны по причине нетолерантности.

                                              Но вообще тут всё очевидно. Если в некоей культуре не принято научное мировоззрение, а принято мракобесие — получите результат в виде дремучего народа. Ну и отсюда уже один шаг до национальности. Просто потому что определённым национальностям свойственна определённая культура.

                                              Это НЕ причинно-следственная связь. Это грустная констатация нашей жизни — рождаясь в конкретной стране, в окружении определённой культуры, вы и будете ей воспитаны — независимо от вашей ДНК. Родитесь в каком-нибудь Сомали — не надейтесь на Нобелевку.

                                              Может когда-нибудь — в светлом будущем — рождающиеся люди будут реально равны, независимо от географии, пола, расы, родителей. А пока — увы.
                                                0
                                                Тогда первое же следствие из «очевидного» — это тот факт, что оная «культура» неравномерна. Сильно неравномерна. В глубинке где угодно она будет иной, нежели в культурно-научной столице этого же где угодно. При том, что самоучный самородок(как и непонимающий тупка) и там, и там вполне может появиться.
                                            +3
                                            По своему опыту нанимания индусов на upwork, причем далеко не с минимальными ценниками, всё-таки у них есть неприятные особенности, связанные с работой. Не столько неразумность, сколько постоянное желание срезать несрезаемые углы, причем даже на почасовой оплате.
                                            +24
                                            Баги, несуразности, тормоза в продуктах MS не чинятся ДЕСЯТИЛЕТИЯМИ

                                            Значки в трее убитых программ до сих пор исчезают только после наведения на них. А ведь этот баг тянется ещё с Windows XP!
                                              +6
                                              Раньше, с Windows 2000, а возможно даже с NT или с классической ветки 95/98.
                                                +7
                                                Вы что, хотите, чтобы MS перестал заниматься постоянными улучшениями UX в своих OS и выпускать обновления каждые три месяца?)
                                                  0
                                                  На семёрке всплывающая подсказка остаётся на экране, пока снова не наведёшь на его значок.
                                                    0
                                                    Значки в трее убитых программ до сих пор исчезают только после наведения на них. А ведь этот баг тянется ещё с Windows XP!

                                                    Такое поведение тянется с самой первой версии Windows с панелью задач и треем. Но это не ошибка, а банальная оптимизация, которая сделана намерено. Как раз для того, чтобы поменьше было такого, как то, что описано в данной статье. Слишком накладно на каждый вызов TerminateProcess() и других причастных функций шерстить все иконки в треях всех сессий.

                                                    Вообще, как показывает опыт чтения блогов разработчиков, 99% случаев того «странного» поведения Windows, которое диванные оналитеги считают ошибками, на самом деле являются осознанными решениями, которые продиктованы объективными обстоятельствами.
                                                      +3
                                                      Неубедительно. Держать в памяти короткий массив из соответствий «pid — хэндл иконки» и пробегаться по нему при завершении процесса было бы очень быстро, вряд ли даже измеримо в мс на современных машинах. А вы это сравниваете с чтением файла 100 000 раз.
                                                        0
                                                        Вы хоть понимаете, что explorer.exe — обычное приложение юзерспейса, а процессы прибиваются в ядре? Тут нужен фундаментальный механизм уведомления пользовательских приложений о рождении и смерти процессов, без которого ваш массив будет требовать непрерывного опроса. А о непрерывных опросах разработчики MS сто раз уже написали в духе «сами не делаем и никому делать не рекомендуем».
                                                          +2
                                                          Тут нужен фундаментальный механизм уведомления пользовательских приложений о рождении и смерти процессов, без которого ваш массив будет требовать непрерывного опроса
                                                          И за 20 лет такой механизм сделать не удосужились? Притом что ядро современных версий Windows — раз в 10 увеличилось?
                                                            0
                                                            А зачем? Это фундаментальное улучшение не принесет прибыли, а пипл схавает и так.
                                                              0
                                                              Но ведь перестал хавать. Если с Windows 3.0 на Windows 3.1 пересаживались добровольно, то всё, что после XP — приходится «всучивать» разными способами. На Windows 10 — даже при всех сверхусилиях, удалось пересадить половину пользователей только через 4 года после релиза!

                                                              P.S. На 95/XP тоже переходили долго, на самом деле, но там всё понятно: требовалось обновить железо, приходилось копить на апгрейд. Но вы видели сейчас хотя бы одного человека, который не пользуется Windows 10, но собирается и копит на неё деньги? Я — ни разу, ни одного. А вот людей, которые держатся за Windows 7 — полно (есть ещё и такие, кто Windows XP использует)
                                                                0
                                                                Но ведь перестал хавать

                                                                Я думаю если посмотреть на продажи и прибыли, то мы увидим что если что-то и изменилось, то скорее в другую сторону. Во всяком случае оборот у Microsoft'а растёт из года в год.

                                                                  0
                                                                  Вот только этот оборот уже давным-давно не от продаж Windows. И даже офис оказался никому не нужным вне PC (Windows Phone и планшеты на Windows должны были покупать как раз из-за офиса… Но не покупали).

                                                                  Продавать же людям, которые покупают Windows только и исключительно из-за отсутствия альтернативы можно вообще что угодно — зачем при этом регулярно портить то, что было раньше сделано?
                                                                    0

                                                                    То что оборот такой может и не из-за самой винды я спорить не буду. Но даже если винда сама по себе там не основной фактор, то всё равно её приходится покупать чтобы нормально работать.


                                                                    А на тему "портить"… Я сам не особый фанат постоянных изменений, но часть из них всё-таки просто необходима и тут никуда не денешься. А часть продиктована рынком и "средним пользователем", который например хочет вещи вроде Lenovo Yoga с тачдисплеем и планшет-модом.


                                                                    И таких "хотелок" куча и всем надо угодить. И конечно в теории можно выпускать разные версии операционок под разные запросы, но Microsoft решил пойти другим путём. И тут я честно признаюсь что моих знаний/умений однозначно не хватает чтобы оценить правы они были или нет.


                                                                    П.С. А учитывая вот такие ситуации (прошу прощения что на немецком) и цены я уже и смирился с тем что получаю...

                                                                      0
                                                                      randomascii.wordpress.com/2018/08/16/24-core-cpu-and-i-cant-type-an-email-part-one
                                                                      Сегодня вот прочитал, нашёл в этом треде по одной из ссылок.

                                                                      Серьёзно, всей этой проблемы попросту не было бы — как не понадобилось бы и десятков человекочасов, затраченных на решение отдельных недоработок, приведших к её появлению — если бы в MS лет 5 назад не сделали такую вещь, как CFG (а ещё раньше не сделали бы ASLR, без которой всем и так прекрасно жилось).
                                                                  0
                                                                  Так ведь вопрос же еще в долях рынка.

                                                                  Сколько таких, критичных, как вы среди частных лиц? А какую долю в рынке имеют корпоративные закупки?
                                                                    0
                                                                    А какую долю в рынке имеют корпоративные закупки?
                                                                    Корпоративные закупки — как раз отличный показатель. Многие компании вот только вот-вот сейчас сползли с Windows 7. Тянули до последнего. Думаете это происходит из-за того, что им очень нужны пердосвистелки из Windows 10?

                                                                    Воспрос риторический.
                                                                      0
                                                                      Многие компании вот только вот-вот сейчас сползли с Windows 7.

                                                                      А вот тут мне бы интересно было посмотреть на цифры и сколько процентов составляют эти "многие". Все известные мне фирмы/конторы на win10 уже давно перешли и не то чтобы с каким-то огромными проблемами.


                                                                      П.С. А учитывая что в Европе многие фирмы берут компы в лизинг и/или просто меняют их где-то раз в пять лет, то они с новыми компами автоматом получали и win10. Так что надо ещё и по странам отдельно смотреть где как дела обстоят.

                                                                        +3
                                                                        П.С. А учитывая что в Европе многие фирмы берут компы в лизинг и/или просто меняют их где-то раз в пять лет, то они с новыми компами автоматом получали и win10.
                                                                        Если мы говорим про достаточно большие фирмы, то они ставят, обычно, свою сборку Windows Enterprise Edition. Которую, сюрприз-сюрприз, обновлять не любят — это затраты на переобучение и прочее.

                                                                        А вот тут мне бы интересно было посмотреть на цифры и сколько процентов составляют эти «многие».
                                                                        Тот факт, что Windows 10 только в этом году обогнала Windows 7 по популярности, по моему, говорит о многом.

                                                                        Даже если считать, что компьютеры обновляются раз в пять лет, и пользователи используют то, что получают от продавца — это должно было бы случиться раньше. А если ещё вспомнить, как Windows 10 пихали бесплатно всем пользователям Windows 7… то вывод очевиден: все добавленные после Windows 7 пердосвистелки не приводят к росту популярности. Скорее ситуацию можно охарактизовать как «пользователи ненавидят Windows 10, но используют из-за отсуствия альтернативы».
                                                                          0

                                                                          Общую статистику по win10 я видел и не оспариваю. Интересно посмотреть как оно выглядит по сегментам и странам.


                                                                          Ну и как бы у нашей фирмы переход на win10 каких-то особых проблем не вызвал. Во всяком случае не больше чем на предыдущие версии. У нас например скорее проблемы с тенденций Microsoft'а переносить всё в онлайн-сервисы и cloud.

                                                                            0
                                                                            пихали бесплатно всем пользователям Windows 7
                                                                            Правда это не работало для энтерпрайз пользователей и за обновление до 10 надо было платить (если нет SA).
                                                                  +1

                                                                  Есть такие механизмы. Для отслеживания старта процессов посложнее: свой драйвер использующий PsSetCreateProcessNotifyRoutine. Для отслеживания завершения: EnumProcesses, OpenProcess, WaitForMultipleObjects.


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

                                                                    +1
                                                                    Для отслеживания завершения: EnumProcesses, OpenProcess, WaitForMultipleObjects.

                                                                    Я ждал это решение. Долговато :)

                                                                    А теперь расскажу такую историю. На заре проектирования оконного интерфейса, в MS встал вопрос о том, как лучше всего организовать разделение окна на клиентскую и неклиентскую области. Нужно было сделать так, чтобы ограничить случайное влияние программиста на служебные области окна, типа заголовка и бордера. Самым очевидным и архитектурно правильным решением было сделать «матрешку», когда вся клиентская область является дочерним окном внутри основного окна GUI. Через вызовы API разработчику всегда отдавать дескриптор именно дочернего окна, а служебные кнопки управления разместить на материнском окне уровнем выше. Но это решение было отклонено из-за того, что оно требовало двух дескрипторов на каждое пустяковое окно. Вместо этого наворотили костыль с уменьшенным в размере device context окна, который не затрагивает служебные области. Все из-за одного лишнего дескриптора.

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

                                                                    В майкрософте долгое время работали довольно жесткие требования к оптимизации работы системы. Это и принцип «не жди в цикле, используй блокирующую ф-цию», и «не сохраняй в память мелочь, которую можно быстро пересчитать», и «вероятное на 1/1000000 событие произойдет через минуту», и много другого. Сегодня, похоже от этой практики отказались, к сожалению.
                                                                      0
                                                                      В майкрософте долгое время работали довольно жесткие требования к оптимизации работы системы. Это и принцип «не жди в цикле, используй блокирующую ф-цию», и «не сохраняй в память мелочь, которую можно быстро пересчитать», и «вероятное на 1/1000000 событие произойдет через минуту», и много другого. Сегодня, похоже от этой практики отказались, к сожалению.
                                                                      Но ошибку, в результате, так и не исправили.

                                                                      В результате имеем систему которая одновременно и жрёт ресурсы, как не в себя, и глючит. Отличное сочетание.
                                                                        0
                                                                        Это не ошибка. Ошибка — это не соответствующее ТЗ поведение программы вследствие неправильно написанного кода. Тут все работает как и было задумано.

                                                                        Что до современных версий, то здесь просто принцип «без крайней необходимости ничего старого не меняем», а новое пишем уже «тяп-ляп и в продакшен».
                                                                          0
                                                                          Ошибка — это не соответствующее ТЗ поведение программы вследствие неправильно написанного кода.
                                                                          С точки зрения пользователя ошибка — это несоотствие поведения программы ожидаемому. Пользователи ТЗ не читают.

                                                                          Конечно все пользователи разные, так что что для одного ошибка — для друого может быть фичей… но вот конкретно в случае с треем я не видел никого и никогда, кому бы существующее состояние нравилось.
                                                                            0
                                                                            С точки зрения пользователя ошибка — это несоотствие поведения программы ожидаемому

                                                                            Нуууууу, так мы можем договориться до того, что даже стандартный «калькулятор» насквозь глюкавый, потому что некий юзер ожидает от него поведение как у MathCAD.

                                                                            я не видел никого и никогда, кому бы существующее состояние нравилось

                                                                            Нравится/не_нравится — это не те критерии, по которым баг отличают от фичи. Я не знаю, есть ли какое-то официальное подробное руководство по Windows, но если есть, то в нем вполне может быть описано данное поведение, что автоматически закрывает данный вопрос.
                                                                              0
                                                                              Пользователи ТЗ не читают.
                                                                              И не пишут, т.е. не участвуют в формулировании. Даже корпоративные. Но продукт оплачивают именно пользователи. А на спецификации повлиять не могут. Своеобразная ситуация.
                                                                                0
                                                                                И не пишут, т.е. не участвуют в формулировании. Даже корпоративные.

                                                                                На самом деле корпоративщики имеют какой-то канал продавливания своих фич. Правда, иногда их хотелки немного расходятся со здравым смыслом (пример есть у меня).
                                                                                  0
                                                                                  Корпорации, всё же, отличаются и размерами, и степенью влияния на MS. Вероятно, скажем у HP такое влияние есть, но специфичны их компьютеры, в основном, на уровне BIOS/UEFI; судя по огромному количеству кастомного софта HP, им легче написать свой костыль, чем убедить MS.

                                                                                  ИЗ программых особенностей HP, пожалуй, стоит выделить наличие драйверов для корпоративных моделей ПК и ноутбуков для большого количества версий Windows.
                                                                    0
                                                                    Спорно. taskmgr.exe — тоже приложение юзерспейса. И ничего, опрашивает все процессы раз в секунду, обновляет столбцы, и даже позволяет прибивать процессы по команде. И что самое главное, CPU почти не грузит и лагов вообще не создаёт (и раньше не создавал во времена выхода Windows 2000/XP).
                                                                      +1
                                                                      Ну, интерактивное приложение, работа которого заключается в непрерывном обновлении визуальной информации, сюда очевидно не относится. Медиаплеер, например, вообще в этом плане грузит аж бегом и это нормально.

                                                                      Что касается нагрузки на процессор, то помню, как открытие таскменеджера на первопне/NT4 замедляло mp3-енкодинг сходу процентов на 20.
                                                                    +5
                                                                    С учетом того что и так все объекты как ядра, так и Win32, отслеживаются в таблицах процесса ядром системы, то еще один объект USER хранить и обрабатывать — вообще бесплатно.

                                                                    Тут дело не в этом.

                                                                    А именно, есть нотификации «окно закрыто» / «окно появилось», чтобы эксплорер свой таск бар отрисовал. Причем неважно — по какой причине окно изчезло. Оно ведь убирается когда прога падает? Вооот!

                                                                    Вообще, микрософт очень долго требовала наличие невидимых окон в обязательном порядке. Для DDE, для сокетов (кто помнит первую версию WinSock — оценит).

                                                                    NOTIFYICONDATA nid;
                                                                     
                                                                    nid.cbSize = sizeof(NOTIFYICONDATA);
                                                                    nid.hWnd = hWnd;
                                                                    nid.uID = 100;
                                                                    nid.uVersion = NOTIFYICON_VERSION;
                                                                    nid.uCallbackMessage = WM_MYMESSAGE;
                                                                    nid.hIcon = LoadIcon(NULL, IDI_APPLICATION);
                                                                    wcscpy_s(nid.szTip, L"Tray Icon");
                                                                    nid.uFlags = NIF_MESSAGE NIF_ICON NIF_TIP;
                                                                     
                                                                    Shell_NotifyIcon(NIM_ADD, &nid);
                                                                    


                                                                    И для трея оно тоже — есть. То есть чтобы я добавил что-то в трей — мне надо не забыть RegisterClass/CreateWindow. Ну, чтобы банально получать клики по иконке. Кто-то же должен получать WM_TASKBAR_NOTIFY…

                                                                    А теперь внимание, черный ящик!!! Если эксплорер и так знает все окна в трее, если он и так получает сообщения об их закрытии, то почему он трей при этом не перерисовывает?

                                                                    Великая тайна, ага.
                                                                      0
                                                                      Я кажется понял. Потому что «окно» для трея не закрывается при аварийном падении основного процесса — его закрыть просто некому.
                                                                        +2
                                                                        Если окно закрыть некому — то мы получаем leakage of USER32 resources. Так что вряд ли, это еще в NT4 решили.
                                                                    0
                                                                    То есть по наведению норм, а по завершению процесса нет?
                                                                      +3
                                                                      Explorer со своим треем, он же обычное приложение пользовательского режима. Если какая-то программа скоропостижно сдохла, забыв его попросить убрать иконку из трея, он об этом узнает, только если сам будет периодически опрашивать.
                                                                        +1
                                                                        То есть по наведению норм

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

                                                                        а по завершению процесса нет?

                                                                        Завершение процесса — это событие ядра, которое других пользовательских процессов никоим образом не касается.

                                                                        У процесса explorer.exe нет способа узнать, что superpuperapp.exe только что аварийно завершился, кроме опроса. А опрос во-первых слишком дорог сам по себе, а во-вторых противоречит политике кодирования MS (никаких циклов ожидания/опроса, только блокирующие функции).
                                                                          0
                                                                          Как вариант — user32 для каждой иконки в трее регистрирует mutex и берёт его во владение, при завершении процесса процесс теряет владение mutex-ом, а Explorer ждёт изменение любого mutex-а через WaitForMultipleObjects.
                                                                            0
                                                                            Много можно придумать вариантов, но уж как есть. Обратная совместимость — это ключевое преимущество Windows, благодаря которому она и завоевала львиную долю рынка десктопов.
                                                                              0
                                                                              Предложенное решение не рушит обратную совместимость, т.к. mutex-ы создаются в пользовательском процессе не пользовательским кодом, а кодом USER32, при добавлении иконки в трее.
                                                                                +1
                                                                                Так у user32 те же проблемы. Не факт что такое событие, как смерть процесса, заведено в него нужным образом из kernel32. Сами понимаете, что каждый новый мост между такими модулями — это большое событие, которого стараются избегать до последнего.
                                                                                  0
                                                                                  В user32 не надо заводить событие смерти процесса. Достаточно в внутри NotifyIcon создать mutex (который окажется в контексте пользовательского процесса) и передать его в Explorer.exe вместе с другими параметрами треевой иконки. В момент смерти процесса mutex автоматчески отпустит, эта логика уже в ядре и никаких новых мостов не надо.
                                                                                    +1

                                                                                    Зачем mutex, когда есть process? В NotifyIcon GetCurrrentProcessId(), в эксплорере OpenProcess(), и добавить его в WaitForMultipleObjects().

                                                                                      0
                                                                                      Согласен.
                                                                                        0
                                                                                        Здесь ответил.
                                                                                          0
                                                                                          В трее не больше 10 иконок у среднего юзера. Экономия 10 хендлов имела смысл на 386-х (и то, сомнительно), но сейчас-то никто не мешает сделать отслеживание умирающих приложений с сокрытием его иконки.
                                                                                            0
                                                                                            Блин, за время, которое мы потратили на обсасывание этой фигни, можно было бы написать прибулду, которая будет раз в секунду посылать виртуальное движение курсора каждой иконке, чтобы удалить мертвые.
                                                                                              0
                                                                                              Более того, такой софт уже существует.

                                                                                              When a program is forcefully terminated it is not able to cleanup any of its resources, as a result dead icons are left in the system tray until you hover your mouse over them. Explorer does not perform house keeping and remove any dead icons automatically. SysTray Refresh will keep the system tray area clean.
                                                                                +4
                                                                                А опрос во-первых слишком дорог сам по себе, а во-вторых противоречит политике кодирования MS (никаких циклов ожидания/опроса, только блокирующие функции).
                                                                                В итоге имеем контекстное меню, вызванное на рабочем столе, которое вернётся после таймаута опроса порта выключенного сетевого принтера на предмет присутствия в нём бумаги. Весь Explorer при этом висит.
                                                                                А вот прибить иконку в трее накладно. А там приложение мониторинга температур, бодро докладывающее, что всё ок, температура в норме, но это не точно.
                                                                                  +1
                                                                                  В итоге имеем контекстное меню, вызванное на рабочем столе, которое вернётся после таймаута опроса порта выключенного сетевого принтера на предмет присутствия в нём бумаги. Весь Explorer при этом висит.

                                                                                  Это очень прискорбно, но какое решение вы предлагаете для подобных ситуаций? Не обязательно с принтером, а, например, когда за отрисовку пункта меню отвечает стороннее приложение, которое тупит. Что делать?

                                                                                  А там приложение мониторинга температур, бодро докладывающее, что всё ок, температура в норме, но это не точно

                                                                                  А если это приложение не вылетело, а зависло? Температура будет точно так же «в норме», но повода убивать иконку у експлорера вообще никакого.

                                                                                  Не нужно перекладывать с больной головы на здоровую. Если приложение виснет или вылетает, системный шелл не нанимался ему сопли подтирать.

                                                                                  А такие вещи, как мониторинг температуры вообще должны работать сервисами, для которых есть штатный механизм перезапуска после сбоя.
                                                                                    +1
                                                                                    … за отрисовку пункта меню отвечает стороннее приложение, которое тупит. Что делать?
                                                                                    Свой таймаут добавлять. 500 мс должно хватать всем. Разослали приглашения всем желающим, собрали ответы, подождали 500 мс, кто не успел — тот не успел.

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

                                                                                    А если это приложение не вылетело, а зависло? Температура будет точно так же «в норме», но повода убивать иконку у експлорера вообще никакого.
                                                                                    Вот ни разу у меня hwinfo не вылетало.

                                                                                    А такие вещи, как мониторинг температуры вообще должны работать сервисами, для которых есть штатный механизм перезапуска после сбоя.
                                                                                    Подпишусь. Только производителям железа это не нужно, потому из коробки отсутствует. А брендовые утилиты мониторинга температуры и управления охлаждением это ужас.
                                                                                      +1
                                                                                      Свой таймаут добавлять. 500 мс должно хватать всем. Разослали приглашения всем желающим, собрали ответы, подождали 500 мс, кто не успел — тот не успел.

                                                                                      То есть, другими словами, если сторонний код написан на каком-нибудь .NET и тупо не успел стартануть за это время, пункт меню мы не увидим? А во второй раз, когда виртуальная машина уже «разогрета» — то уже увидим? Зашибись. И, кстати, почему 500 мс? Почему не 100 или не 1500?

                                                                                      Вот ни разу у меня hwinfo не вылетало.

                                                                                      Тогда зачем вы этот пример выше привели?
                                                                                        0
                                                                                        За 1500 мс я откушу себе мышку. Или перестану пользоваться контекстным меню. На маках как-то обходились одной кнопкой мышки.

                                                                                        Речь, если правильно понимаю, исходно шла о том, что приложение, зарегистрировавшее иконку в трее, прибили, а иконка осталась. Если падает само, значит, можно обойтись и без него.
                                                                                          0
                                                                                          Тут уже разговор пошел шире.

                                                                                          Что делать в ситуациях, когда поведение шелла зависит от сторонних приложений, ведущих себя неподобающим образом. И, как видите, однозначного ответа тут нет, все решения компромиссны. Или ждем процесс-тормоз, или игнорируем его, хотя в принципе, он выйдет на готовность через 10 мс после истечения таймаута и готов без проблем выполнять свою функцию.

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

                                                                                            В данном случае в контекстное меню можно добавить пункт "...", куда ссыпать все неотозвавшиеся в разумные сроки тормозные процессы. Если при первом проходе пользователь недосчитался нужного ему ответа, он может осознанно выбрать данный пункт, подождать и получить недостающие статусы. Как спойлер на Хабре — кому-то нужно быстро пролистать, кому-то заглянуть под капот. Но замедлять каждую операцию ради вероятнее всего несущественной информации представляется некорректным.
                                                                                              0
                                                                                              Предложенный вами вариант нарушает детерменированность поведения системы. В зависимости от не очевидных факторов некоторые пункты будут оказываться то в основном меню, то в подменю «тормозов». После такого набежит еще больше диванных ыкспертов с криками «ааааа! глюкавая венда!!!11111».
                                                                                                0
                                                                                                Действительно, непорядок.
                                                                                                Тогда предлагаю вместо загрузки системы вывести сообщение «Подождите, идёт улучшение», так система приобретёт окончательную детерминированность.
                                                                                              0
                                                                                              Если воспринимать трей как каталог, в котором приложения создают некие файлы-маячки и сами должны их удалять, то такое поведение оказывается вполне логичным.
                                                                                              Такое мнение имеет право на жизнь. Но в этом случае, значок мёртвого процесса не должен пропадать при наведении на него мыши. Ведь именно это вызывает недоумение пользователя.
                                                                                                0
                                                                                                Все правильно! В ранних альфах win95 при попытке интерактивного взаимодействия с таким значком выдавался месседжбокс, что приложение, создавшее значек, было неожиданно закрыто. И знаете что? Это раздражало пользователей. Юзера, блин, не читают месседжбоксы, они поскорее нажимают OK чтобы вообще не видеть их. И получалось, что вместо ожидаемого окна иконка начинала выводить что-то «непонятное». Как будто программа все еще запущена, но работает как-то не так как нужно.

                                                                                                Вы не представляете, сколько полезных и уже реализованных функций было в итоге пущено в корзину из-за неадекватности потенциальных юзеров/разработчиков/производителей. Сколько шлака и нелогичностей добавлено в систему, чтобы говнокод, которому место на помойке, продолжал работать. Сколько ненужной работы сделано, чтобы тупому юзеру система казалась стильнее, моднее и молодежнее.
                                                                                                  0
                                                                                                  И получалось, что вместо ожидаемого окна иконка начинала выводить что-то «непонятное». Как будто программа все еще запущена, но работает как-то не так как нужно.
                                                                                                  И уже в этот момент добжно было бы стать понятно, что иконки от «умерших» приложений должны были бы из трея пропадать.

                                                                                                  Ну хорошо, к релизу Windows 95 проблему исправить не успели. Бывает. Почему за прошедшие 25 лет не исправили???

                                                                                                  Сколько ненужной работы сделано, чтобы тупому юзеру система казалась стильнее, моднее и молодежнее.
                                                                                                  Вот только «тупой юзер» этого не ценит и предпочитает старые версии… странно, правда?
                                                                                                    0
                                                                                                    иконки от «умерших» приложений должны были бы из трея пропадать

                                                                                                    Они и пропадают. Но триггером для этого является какое-нибудь действие пользователя. Исключительно с позиции оптимизации.

                                                                                                    Почему за прошедшие 25 лет не исправили???

                                                                                                    Давайте добавим сюда еще и то, что %temp% загаживается. Явления одной природы ведь.

                                                                                                    А, кстати, знаете, почему винда не чистит темпы при перезагрузке, как линукс?
                                                                                                      +1
                                                                                                      Они и пропадают. Но триггером для этого является какое-нибудь действие пользователя.

                                                                                                      Угу. То есть работал я и работал, иконка тихо пропала — я бы и не заметил. Но как только я потянуля мышкой, чтобы нажать именно на ту иконку (которая отлично видна) — а она прямо из-под курсора бац, и пропала! Не раздражает совершенно! (сарказм)

                                                                                                        0
                                                                                                        С другой стороны, так вам будет дан пассивный сигнал, что с данным приложением есть проблемы. Если бы иконка тихо исчезла, вы бы не заметили этого, и думали, что просто забыли запустить или уже закрыли программу. А так именно в момент попытки использования получите и распишитесь.
                                                                                                          0
                                                                                                          Это уже натягивание совы на глобус.
                                                                                                            +2

                                                                                                            Напоминает


                                                                                                            тот анекдот

                                                                                                            — Рабинович, как Вы могли — говорят, Вам вчера в автобусе дали оплеуху, а вы даже не отреагировали!
                                                                                                            — Я?!? Не отреагировал?! А кто же тогда упал?

                                                                                                        0
                                                                                                        Вот только «тупой юзер» этого не ценит и предпочитает старые версии… странно, правда?

                                                                                                        То, о чем я написал, отнюдь не новое веяние.

                                                                                                        Как пример, история времен Windows 95. При отображении каталога в проводнике, имена файлов, содержащие только буквы верхнего регистра, целиком приводятся к нижнему (EXPLORER.EXE -> explorer.exe). Мультирегистровые и полностью нижнерегистровые имена не изменяюся. Нахрена это сделано? В момент перехода на Win95 у каждого пользователя имелся солидный багаж файлов, созданных в DOS на FAT-диске без vFAT (т.е. без информации о регистре букв имени). Эти файлы в самой DOS при выполнении команды DIR выводились в верхнем регистре. И вот, чтобы список файлов в проводнике выглядел не так архаично, как листинг каталога на экране DOS, эти файлы были заловеркейсены. И юзера, кстати, оценили, ибо список из сотни верхнерегистровых файлов действительно выглядит как-то тяжелее для психики.
                                                                                                          0
                                                                                                          Это всё прекрасно, но не объясняет того факта, что на то, чтобы изгадить интерфейс и вызвать ненависть пользовалей — ресурсы находятся, а на то, чтобы исправить ошибки — нет.
                                                                                                            0
                                                                                                            Это проблемы менеджмента любой современной конторы. Свистелки и перделки вперед всего. В гугле, например, это вообще перешло в эпидемию: «двигаем кнопки просто чтобы что-то поменять, отрапортовать о новой версии, получить премию». Совок напоминает.
                                                                                                              0
                                                                                                              Совок напоминает.
                                                                                                              Совок плохо кончил. Во многом именно поэтому. Ждём краха ИТ-индустрии? Или?
                                                                                                                +1
                                                                                                                Или. Это теперь навсегда :(
                                                                                                                  0
                                                                                                                  В СССР тоже многие думали, что «это теперь навсегда».

                                                                                                                  То что крах «чего-то», в таких условиях, неизбежен — это 100%.

                                                                                                                  А вот что именно крякнет — это можно обсуждать…
                                                                                                        0
                                                                                                        Все правильно! В ранних альфах win95 при попытке интерактивного взаимодействия с таким значком выдавался месседжбокс, что приложение, создавшее значек, было неожиданно закрыто
                                                                                                        А нахрена? Кто-то просил выводить это сообщение?
                                                                                                        Если воспринимать трей как каталог, в котором приложения создают некие файлы-маячки и сами должны их удалять,
                                                                                                        То и нефиг что-то делать без ведома программы, пусть даже уже покойной.
                                                                                                          0
                                                                                                          То и нефиг что-то делать без ведома программы, пусть даже уже покойной.

                                                                                                          Так вы же сами топите за немедленное удаление!
                                                                                                            +1
                                                                                                            Понимаете, все пользователи «топят» за вменяемое поведение: либо иконка есть и работает, либо её нет. Иконка, которая вроде как есть, но которую использовать нельзя — это бардак.
                                                                                                              0
                                                                                                              Так вы же сами топите за немедленное удаление!
                                                                                                              Я обсуждаю предложенную модель «воспринимать трей как каталог, в котором приложения создают некие файлы-маячки». Если иконка может жить без приложения, то пусть так и будет. Если иконка должна жить только вместе с приложением — тоже принимается. Но текущее поведение — это ни та модель, ни другая.
                                                                                                +1
                                                                                                Это очень прискорбно, но какое решение вы предлагаете для подобных ситуаций? Не обязательно с принтером, а, например, когда за отрисовку пункта меню отвечает стороннее приложение, которое тупит. Что делать?

                                                                                                Нарисовать в пункте меню заглушку (скажем, «Ждём ответа от принтера»), а когда ответ придёт — поменять пункт на результат.
                                                                                                  –1
                                                                                                  Ну, у меня есть для этого
                                                                                                  специальный скриншот
                                                                                                  image
                                                                                                    +1
                                                                                                    Это не та ситуация.
                                                                                                      0
                                                                                                      Ситуация не та, но «проблема» похожа. Они могли бы вместо мессаджбокса сделать это в меню Файл-Печать и тогда это была бы именно та ситуация, верно? От себя добавлю, что сей мессаджбокс выводился автоматически сам при запуске ворда, без активации меню печати.
                                                                                              +2
                                                                                              Как это нет способа узнать?
                                                                                              Большой taskbar успешно может, а маленький iconbar не может?
                                                                                                0
                                                                                                Большой таскбар отображает все окна определённого типа.
                                                                                                А чтобы попасть в трей, приложение должно зарегистрировать значок отдельным вызовом. Соответственно, потом разрегистрировать другим вызовом.
                                                                                                Что, впрочем, не мешает некоторым приложениям отображать беглую анимацию в трее.
                                                                                                Просто нужно либо обязать приложение перед закрытием разрегистрировать значок, либо самому трею периодически проверять все зарегистрированные значки на актуальность, что действительно на фоне темы статьи не так уже и напряжно.
                                                                                                +3
                                                                                                Открываем SetWindowsHookEx, ставим WH_SHELL hook, и ловим HSHELL_WINDOWDESTROYED event.

                                                                                                Появилось с W2k.

                                                                                                Используется explorer, а затем и dwm чтобы перерисовывать таск бар.

                                                                                                Во дела, прошло 20 лет и уже «нет способа» :-)
                                                                                                  +1
                                                                                                  Даже если не обращать внимание на то, что хуки сами по себе тяжеленная штука, что хук для другой архитектуры требует отдельного процесса, что глобальный хук может требовать эскалации привилегий, то все равно выясняется, что некоторые приложения (антивирусы и фаерволлы в первую очередь) активно противятся инжекции сторонней DLL, и что, внезапно, при принудительном прихлопывании процесса, HSHELL_WINDOWDESTROYED просто не приходит.
                                                                                                    0
                                                                                                    Это для WH_CBT или WH_CALLWNDPROC требуется внедрение DLL в процессы, и это действительно тяжелая штука.

                                                                                                    А я речь веду о вот таком. Специально нашел вам пример на дотнете.

                                                                                                    public class SystemProcessHookForm : Form
                                                                                                    {
                                                                                                    ...
                                                                                                        public SystemProcessHookForm()
                                                                                                        {
                                                                                                            // Hook on to the shell
                                                                                                            msgNotify = Interop.RegisterWindowMessage("SHELLHOOK");
                                                                                                            Interop.RegisterShellHookWindow(this.Handle);
                                                                                                        }
                                                                                                    
                                                                                                        protected override void WndProc(ref Message m)
                                                                                                        {
                                                                                                            if (m.Msg == msgNotify)
                                                                                                            {
                                                                                                                // Receive shell messages
                                                                                                                switch ((Interop.ShellEvents)m.WParam.ToInt32())
                                                                                                                {
                                                                                                                    case Interop.ShellEvents.HSHELL_WINDOWCREATED:
                                                                                                                    case Interop.ShellEvents.HSHELL_WINDOWDESTROYED:
                                                                                                                    case Interop.ShellEvents.HSHELL_WINDOWACTIVATED:
                                                                                                                        string wName = GetWindowName(m.LParam);
                                                                                                                        var action = (Interop.ShellEvents)m.WParam.ToInt32();
                                                                                                                        OnWindowEvent(string.Format("{0} - {1}: {2}", action, m.LParam, wName));
                                                                                                                        break;
                                                                                                                }
                                                                                                            }
                                                                                                            base.WndProc(ref m);
                                                                                                        }
                                                                                                    ...
                                                                                                    }
                                                                                                    


                                                                                                    Как видите, реализация очень проста, не требует никаких инъекций кода и отдельных DLL (хотя и это тоже достаточно простая штука, закинул свою DLL-ку в реестр и все), и вполне себе работает.

                                                                                                    И да, ядро много чего делает для Win32 контекста, в том числе — освобождая ресурсы user/gdi. И в том числе — рассылает и нотификации для top-level windows.

                                                                                                    Я даже лет 15 назад пытался делать нечто похожее, чтобы без сервиса и агента в трее, но выглядело это трюкачеством :-)
                                                                                                      0
                                                                                                      Отвечу одной цитатой из MSDN:
                                                                                                      This function is not intended for general use. It may be altered or unavailable in subsequent versions of Windows.

                                                                                                      Ну и в догонку:
                                                                                                      HSHELL_WINDOWDESTROYED :: A handle to the top-level window being destroyed.

                                                                                                      Сомневаюсь, что это вообще применимо к невидимым служебным окнам.
                                                                                                        +1
                                                                                                        handle to the top-level window

                                                                                                        Ваша контр-аргументация должна бы выглядеть как-то так: вот пример (код) того что в трей можно поместить не только top level window, это работает, и это ломает всю красоту схемы. Нашелся кейс для которого… и т. д.

                                                                                                        А раз можно туда подсунуть окно со стилем WS_CHILD — то и смысл отслеживать только top levels пропадает. Так?

                                                                                                        А то мы скоро дойдем до цитирования Windows 95 internals в попытках выяснить — какой же из нескольких способов отслеживания закрытия top-level window будет настолько симпатичен, что вы все-таки согласитесь — все-таки могла микрософт им воспользоваться :-)

                                                                                                        Или наоборот — забракуете все предложенные, и перейдем к гаданию на кофейной гуще в стиле «что же помешало микрософту за 25 лет сделать еще один способ» :-)
                                                                                                          0
                                                                                                          вот пример (код) того что в трей можно поместить не только top level window, это работает, и это ломает всю красоту схемы

                                                                                                          Каюсь, кода не дам, нет времени и возможности сейчас. Но вообще-то в NOTIFYICONDATA.hWnd очень даже можно передать дескриптор невидимого окна нулевого размера. Более того, чаще всего именно так и делают.

                                                                                                          Или наоборот — забракуете все предложенные, и перейдем к гаданию на кофейной гуще в стиле «что же помешало микрософту за 25 лет сделать еще один способ» :-)

                                                                                                          Сделать-то они могли все что угодно, но ресурсы у них были ограничены, время поджимало, было не до таких красивостей. А потом включился режим «если как-то работает, то не трогаем».
                                                                                                            +1
                                                                                                            Каюсь, кода не дам, нет времени и возможности сейчас. Но вообще-то в NOTIFYICONDATA.hWnd очень даже можно передать дескриптор невидимого окна нулевого размера.

                                                                                                            Да. И как правило (и как в примерах микрософта) — это топ-левел полученный через RegisterClass()/CreateWindow() :-)

                                                                                                            Оттого что оно невидимое и оттого что у него размер (кстати неважно какой) — оно ведь не перестает быть top level.

                                                                                                            Итого — вся правка должна была содержать три строчки в таск баре
                                                                                                            case HSHELL_WINDOWDESTROYED:
                                                                                                                SendMessage(трей, WM_USER + NNN, 0, lParam);
                                                                                                                break;
                                                                                                            и небольшой кусочек кода в обработке трея

                                                                                                            case WM_USER + NNN:
                                                                                                                for(int i=0; i <  m_cIconsCount; ++i) {
                                                                                                                    if (IsDead(m_Icons[i])) {
                                                                                                                        ReleaseIconContext(m_Icons[i]);
                                                                                                                        MoveMemory(&m_Icons[i], &m_Icons[i+1], sizeof(m_Icons[0]) * (m_сIconsCount - i - 1));
                                                                                                                        --i;
                                                                                                                        --m_cIconsCount;
                                                                                                                        InvalidateRect(m_hWnd, NULL);
                                                                                                                    }
                                                                                                                }
                                                                                                                break;

                                                                                                            И в общем-то все, остальное и так есть и используется. Кстати заметьте, если «внутри» там список а не массив, то код будет чище и короче. Массив просто вероятнее.

                                                                                                            И кстати, если бы это работало для топ-левелов, то все тут же бы стали использовать топ-левелы, это и сейчас так происходит, но стихийно.
                                                                                                    +2
                                                                                                    HSHELL_WINDOWDESTROYED приходит при вызове DestroyWindow, не уверен, что он придёт при аварийном завершении процесса.
                                                                                                      0
                                                                                                      DestroyWindow function

                                                                                                      Destroys the specified window. The function sends WM_DESTROY and WM_NCDESTROY messages to the window to deactivate it and remove the keyboard focus from it…

                                                                                                      Это по очевидным причинам — не то :-)
                                                                                              0
                                                                                              Это фича.
                                                                                              0
                                                                                              Это не баг, а логика работы иконок в трее.
                                                                                              Приложение, желая создать в трее иконку, вызывает соответствующую функцию.
                                                                                              Когда нужно иконку удалить, оно вызывает функцию удаления.
                                                                                              Если процесс приложения прибит, то функция удаления не вызвана и иконка не удалена.
                                                                                              В противном случае, процессу проводника нужно было бы следить за всеми процессами, создавшими иконки в трее, что имхо оверхед.
                                                                                                +6
                                                                                                Вы еще скажите, что за окнами, открытыми файлами и выделенной памятью тоже следить не надо, по той же логике. Это именно что корявый дизайн, сделанный на скорую руку.
                                                                                                  0
                                                                                                  Это разные уровни привилегий. Нотификэйшн-бар в пространстве пользователя, а средства зачистки всего вами названного — в ядре. А механизмов, которые бы из ядра сообщили юзермоду о смерти процесса, просто нет.
                                                                                                    0
                                                                                                    А таскбару кто-то же сообщает о смерти процесса?
                                                                                                      0
                                                                                                      Таскбар не знает о процессах, а отображает top-level windows.
                                                                                                      Хотя, как выше заметили, каждая иконка в трее связана с каким-либо окном, поэтому замечание в принципе верное.
                                                                                                      0
                                                                                                      А таскменеджер — не в пространстве пользователя работает? У него же есть окно, в котором данные выводятся.
                                                                                                  +2
                                                                                                  Ну а что, зато такты процессора не тратятся зря на ерунду, ведь убирать значки надо очень редко, а вот дёргать проверки — постоянно
                                                                                                  Я думаю, какая-то такая причина за этим стоит :)
                                                                                                    +3
                                                                                                    Причем очень несложная причина :-)

                                                                                                    Невидимые окна можно создавать и удалять со скоростью во много раз большей чем сможет на них реагировать трей. Всего лишь.

                                                                                                    Причем таскбару это не грозит — он отслеживает события активации / деактивации, это достаточно медленный процесс с переводом и обработкой смены фокуса, ввода клавиатуры, обработкой тонны событий в окнах и их содержимом, все эти erasebgnd, перерисовки, вычисления всего и вся (повторить для своих чайлдов рекурсивно), все то что реально происходит при смене активных окон.

                                                                                                    Уж обвести рамочку вокруг плашки с иконкой (и опционально текстом) показывающим состояние — оно точно успеет. Более того — оно успевает и thumbnail снять и еще покурить и выпить чашечку кофе :-)

                                                                                                    А вот трею надо как-то успевать реагировать (и быстро) на кипящий поток удаляемых окон, и проверять каждое — а оно вообще живо? А оно события от трея ловит? Ну и высчитать в связи с этим что показываем / не показываем, все эти хинты и подсказки, и прочая и прочая. В коде решили упростить (как оно обычно бывает):
                                                                                                        ...
                                                                                                    else 
                                                                                                        InvalidateRect(весь трей целиком)
                                                                                                    

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

                                                                                                    Потому и решили — вообще убрать, черт-те что получилось. Будем считать это фичей! А вызов кода перенесли на события от мыши.

                                                                                                    Прошло двадцать пять лет…

                                                                                                    Я полагаю что мой рассказик — весьма похож на реальные события, хотя конечно это только красивая гипотеза.
                                                                                                      0
                                                                                                      Я первое своё предложение хотел выделить тегом <sarcasm>, но он увы съелся… Да, гипотеза верная скорее всего.

                                                                                                      Правда, по времена, когда писался этот код, thumbnail никакой ещё не снимался от окна (вы ведь про отображение миниатюр в Aero?). И чтобы снять такую миниатюру, надо таки сначала дождаться полной отрисовки содержимого окна, так что тут всё сложнее…

                                                                                                      А вот трею надо как-то успевать реагировать (и быстро) на кипящий поток удаляемых окон, и проверять каждое — а оно вообще живо? А оно события от трея ловит?
                                                                                                      Это вы всерьёз или тоже как часть шутки? Какой там поток, мы что, окна в повседневной работе десятками в секунду открываем и закрываем? Или вы про фиктивные, которые «невидимые», и о которых знает только ОС? Но даже их наверное не столько. А уж тех, которые уже через вызов процедуры зарегали себя «в трей», вообще не больше 2-3 за раз обычно. Так неужели правда так сложно по этому списку проходиться линейно хотя бы раз в секунду, чекая их состояние (точнее, состояние процесса, привязанного к ним)? Мне кажется, даже для железа тех лет это совершенно тривиальная задача.

                                                                                                      Да и фликерить тут нечему. Фликерить могло или на стресс-тестах, когда и правда десятки окон в секунду, или из-за криво написанного ПО, которое по нескольку раз пытается зарегать иконку, или из-за каких-то хитрых внутренних таймингов. Например, сначала в клиентском коде идёт регистрация иконки в трей, потом уже создаётся основное окно, и пока оно не создано, explorer считает, что иконки нет, а перед этим она как бы есть, а потом окно открылось, и она снова есть, и в итоге происходит скачок туда-сюда, что смотрится для пользователя безобразно. И в итоге вместо того, чтобы переписать код работы с иконками трея, пошли более простым путём, выпилив вообще мониторинг :)

                                                                                                      В общем, почти как вы сказали, только скорее всего не в мерцании всего трея было дело (перерисовка раз в полсекунды с нормальной двойной буферизацией мерцать ну никак не должна).
                                                                                                        0
                                                                                                        Больше в шутку конечно. По факту — просто не сделали, потом никто не завел тикет на этот минорный баг, потом уже и легенды подтянулись, а там и окаменело. Но сделать — вполне могли, этому ничто не мешало.
                                                                                                          0
                                                                                                          Фликерить могло или на стресс-тестах, когда и правда десятки окон в секунду, или из-за криво написанного ПО, которое по нескольку раз пытается зарегать иконку, или из-за каких-то хитрых внутренних таймингов.
                                                                                                          А возможно дело было в debug сборке Windows, событий там происходит явно больше.

                                                                                                          Из приколов в трее наблюдал скачущего жеребца, состоящего из нескольких соседних иконок, спектр-анализатор и миниатюру танцовщицы, двигающуюся в такт музыке. Всё живенькое и без глюков.
                                                                                                      0
                                                                                                      Зато в десятке починили препротивнейший баг, выражавшийся в том, что запущенные программы иногда не получали значок в трее, хотя доллжны были :)
                                                                                                      0
                                                                                                      Баги, несуразности, тормоза в продуктах MS не чинятся ДЕСЯТИЛЕТИЯМИ


                                                                                                      По моим ощущениям, в десятке еще и насыпали неприличное количество новых.
                                                                                                      +3
                                                                                                      Повезло. А могли бы еще и писать по 68 байт сотни тысяч вызовов. С синком. Каждый. Вот тогда было бы веселье.
                                                                                                      Впрочем, 68 или не 68 — всё равно есть кеш диска и всё равно есть кеш системы. Проблема не в файле, а в количестве системных вызовов на один щелчек мыши. 100К — это слишком много.
                                                                                                        +2
                                                                                                        Тогда не было бы веселья, потому что это быстро бы нашли и пофиксили.
                                                                                                          0
                                                                                                          Конечно пофиксили бы, поставив более производительную железку
                                                                                                        +1
                                                                                                        этот файл это список Quick access и поскольку я этой фичей Єксплорера не пользуюсь, то он у меня маленький и никаких тормозов не создает
                                                                                                          +6
                                                                                                          после удаления файла f01b4d95cf55d32a.automaticDestinations-ms этот файл создается автоматически после запуска проводника
                                                                                                            +1
                                                                                                            У меня создался прямо сразу после удаления.
                                                                                                              0
                                                                                                              значит делаем назначенное задание :-)
                                                                                                                0
                                                                                                                Или переименовываем/удаляем папку %appdata%\Microsoft\Windows\Recent целиком, создаём одноимённый файл и ставим ему атрибут «только для чтения».
                                                                                                                Мне вполне хватает истории файлов в приложениях, общесистемная не нужна.
                                                                                                                  0
                                                                                                                  Надо у system права отбирать и наследование выключать. надежнее.
                                                                                                                    0
                                                                                                                    Конечно. Но пока хватает ;)
                                                                                                                    Как ни странно, простая вещь, а действует пока безотказно, приложения обычно не пытаются понять, что не так. Когда-то во времена разгула вирусов под xp помогало избавляться от особо назойливых.
                                                                                                                      0
                                                                                                                      приложения обычно не пытаются понять, что не так

                                                                                                                      Ага. У меня так Firefox после запрета на запись в каталог системных дополнений, где валяются всякие pocketы, тупо жрал одно ядро в цикле в попытках туда записать. Сейчас же лепит к остальным ((
                                                                                                            0
                                                                                                            По идее, такой файл истории должен у каждой программы быть, которая на панели задач побывала — там же у многих история какая-никакая отображается по правой кнопке.
                                                                                                              0
                                                                                                              Интересно, можно ли безболезненно удалять все файлы в %appdata%\Microsoft\Windows\Recent\AutomaticDestinations?
                                                                                                              У меня их там 44 штуки.
                                                                                                              Размером от 4 Кб до 3 Мб.

                                                                                                              Но, почему-то файла с именем f01b4d95cf55d32a.automaticDestinations-ms среди них нет.
                                                                                                                +7
                                                                                                                А в Windows XP многократный вызов контекстного меню в папке приводил к 100% загрузке процессора. Работает вплоть до SP3 и даже в виртуалке (скриншот ниже). Нагрузка спадает с закрытием контекстного меню.
                                                                                                                Нотариально заверенный скриншот
                                                                                                                image
                                                                                                                  0
                                                                                                                  Как вы это сделали?) У меня не воспроизводится. Win XP SP3, не виртуалка. Кликал правой кнопкой много раз, нагрузка около нуля.
                                                                                                                    +1
                                                                                                                    Выделяешь объект (на скрине я выделил диск) и права кнопка.
                                                                                                                    А вот, например, на папке
                                                                                                                    image

                                                                                                                  +1
                                                                                                                  А меня бесит, что если на таскбаре нажимаешь на кнопку, показывающую все значки рабочего стола, то порой все подвисает секунд на 10. На двух разных машинах.
                                                                                                                    0
                                                                                                                    Возможно есть ярлык на удалённую программу (пытается найти её в других папках) или на недоступный сетевой ресурс. У меня такое было в Windows 7.
                                                                                                                      0
                                                                                                                      Я предполагал такой вариант, но найти ничего не смог. Видимо I must try harder…
                                                                                                                        +1
                                                                                                                        У меня кстати было подобное в одной конторе когда-то. В контекстном меню была ссылка на сетевой ресурс компьютера, который демонтировали. Соответственно каждый вызов контекстного меню в проводнике занимал 2 минуты, на время которых эксплорер-рабочий стол повисал полностью, тот еще квест был.
                                                                                                                        Хорошо что я тогда докопался до истины и получил опыт, тк обычно такое лечат переустановкой винды.
                                                                                                                          0
                                                                                                                          Или ссылка на сетевой принтер в пункте «Печать», проверяющая наличие бумаги в недоступном принтере.
                                                                                                                          +2
                                                                                                                          Проверьте еще обои на рабочий стол. Был случай, 16 мегайбайтный BMP лежащий на недоступном сетевом диске.
                                                                                                                            +1
                                                                                                                            ЕМНИП, это был случай с просто 16MB bmp-шкой при общей ОЗУ в 32MB. Когда просто сворачивание окна (с отрисовкой обоины) вешало машинку на минуту.
                                                                                                                              0
                                                                                                                              Нет, это был случай на моей бывшей работе в 10-11 году. Неделю думали «что не так с этим компом», пока не заметили, что проблемы возникают при отрисовке хотя бы части рабочего стола
                                                                                                                            0
                                                                                                                            По поводу сетевого ресурс: а есть простой способ удалить его при помощи интерфейса? Ждать таймаута очень утомительно и не всегда срабатывает.
                                                                                                                              0
                                                                                                                              через консоль, "net use /?" в помощь
                                                                                                                                –3
                                                                                                                                Даж не знаю что ответить.
                                                                                                                                Во 1 сам по себе ответ уровня «пошел на хрен»
                                                                                                                                Во 2 я говорю о способе для пользователей, это же винда, нужен мышевозильный способ
                                                                                                                                В 3 как ваш рецепт поможет удалить ярлык я не понимаю
                                                                                                                                  0
                                                                                                                                  ПКМ на «сетевом окружении»
                                                                                                                                  Отключить сетевой диск.

                                                                                                                                  ЗЫ все же лучше повесить в логон скрипт авто детач.
                                                                                                                                    0
                                                                                                                                    А причем тут сетевой диск если в закладках висит ярлык на сетевую шару?

                                                                                                                                    Про скрипты по телефону объяснить ну никак, а простого способа я не знаю.
                                                                                                                                    При том что добавить такой ярлык мышечкой легко и просто, а выдернуть его оттуда может быть невероятно весело.
                                                                                                                                    +1
                                                                                                                                    1) я ж не няничка в детском садике чтобы тебя с ложечки кормить, хоть бы попробовал выполнить предложенную команду в консоли и посмотреть на вывод перед тем как писать глупости.

                                                                                                                                    2) как-то определись, тебе простой способ или все же утомительно ждать таймаута.

                                                                                                                                    3) что тебе мешает ярлык «просто удалить»? А лучше внимательнее перечитай свой коментарий на который я отвечал и покажи где там идеть речь о ярлыках.
                                                                                                                                      0

                                                                                                                                      Прежде всего — не "няничка", а вовсе даже "нянечка". (Тут граммар-наци отпустило).


                                                                                                                                      хоть бы попробовал выполнить предложенную команду в консоли

                                                                                                                                      А Вы все-все советы из интернета сразу в консоли пробуете? Качельки лизнуть rm -rf / тоже пробовали?

                                                                                                                                        +4
                                                                                                                                        хоспаде (грама-наци выхади). Там же ключ "/?" стоит. Если ты не в курсе что для видндовых команд этот ключ означате то о чем с тобой говорить, живи в своем мышевозном мире и не задавай глупых вопросов.

                                                                                                                                        Сим бестолковую дискуссию заканчиваю.
                                                                                                                            +1
                                                                                                                            Я не помню, когда появилось отображение в проводнике иконок у файлов в соответствии с заданной программой по-умолчанию, кажется в Windows XP. Добавило огромных тормозов при открытии папок, визуально видно как прорисовываются иконки последовательно для каждого файла. Когда после этого если запускаешь Windows 98 — кажется что проводник летает.
                                                                                                                            Меня вполне устраивали единообразные иконки для папок и отсутствие иконок для файлов. Я всегда включаю отображение расширения файлов, этого вполне достаточно.
                                                                                                                            Может кто-нибудь знает, как отключить иконки? Windows 7/10.
                                                                                                                              +1

                                                                                                                              Включить галку: "Всегда отображать знпчки, а не эскизы"?
                                                                                                                              https://winnote.ru/uploads/posts/2019-01/1548775263_disable_thumbnail_previews_file_explorer_5.png

                                                                                                                                0
                                                                                                                                Спасибо, попробовал — не помогло.
                                                                                                                                Выключал оба пункта:
                                                                                                                                — Always show icons, not thumbnails
                                                                                                                                — Display file icon on thumbnail

                                                                                                                                Я так понял первый пункт служит для отключения превьюшек (например, картинок), а второй показывает иконку типа файла на превьюшке.
                                                                                                                                  +1
                                                                                                                                  А я просто делаю вид как список. Причем с самой Win95. Что со мной не так?
                                                                                                                                    +1
                                                                                                                                    Вы всё делаете правильно, это я неправильно объяснил. Я тоже всегда включаю List View для всех папок.

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

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

                                                                                                                                    Примерный сегодняшний алгоритм действий Винды, как я его понимаю.
                                                                                                                                    1. Мы открываем папку в проводнике.
                                                                                                                                    2. Берётся первый файл в списке, смотрится его расширение.
                                                                                                                                    3. Лезем в реестр, посмотреть что там ему соответствует, какая программа.
                                                                                                                                    4. Лезем в эту программу, чтобы взять от неё иконку.
                                                                                                                                    5. Рисуем иконку рядом с именем файла.
                                                                                                                                    GOTO 2 для следующего файла в списке.

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

                                                                                                                                    Кроме того, для запускаемых файлов, файлов ресурсов и т.д. проводник лезет внутрь этого файла, чтобы вытащить иконку из него. Т.е. для того, чтобы показать мне имя файл в списке, этот файл нужно открыть и прочитать из него данные!!! Я понимаю заботу о простых юзерах — им предложено по-умолчанию показать красивую иконку и обязательно убрать расширение файла — но почему не сделать иконки отключаемыми? Слава богу расширение пока ещё можно включить…

                                                                                                                                    Откройте папку с сотней файлов в любой виртуалке Windows 95 или Windows 3.1, NT — вы поймёте о чем я говорю, там список фалов любых размеров открывается мгновенно.
                                                                                                                                      0
                                                                                                                                      Это всё понятно. Для этого уже в Win98 точно был кеш иконок (который у меня на компьютерах с nForce2 постоянно слетал и показывал кашу). Не уверен за Win95.
                                                                                                                                        +3
                                                                                                                                        Возможно, стоит посмотреть в сторону альтернативных файловых менеджеров. Скажем, Far Manager консольный, там значков нет по определению. А Total Commander поддерживает четыре разных режим для отображения значков, не считая дополнительных настроек.
                                                                                                                                          0
                                                                                                                                          Примерный сегодняшний алгоритм действий Винды, как я его понимаю.

                                                                                                                                          неправильно понимаешь — все иконки хранятся в кеше c:\Users\имяюзверя\AppData\Local\Microsoft\Windows\Explorer\
                                                                                                                                            0
                                                                                                                                            Да всё-равно где они хранятся, их нужно прочитать и нарисовать, а ещё небось добавилось — проверить сам кеш на протухлость и обновить иконку в нем… Сделать тысячи системных вызовов, сто тысяч раз обратиться к реестру. Даже если всё это хранится в RAM это требует времени и ресурсов CPU.