Представьте, что вы хотите показать своим друзьям, как прекрасен Тихоокеанский Северо-Запад. Вы решаете отправиться в путешествие, чтобы сделать несколько фотографий заката над Тихим океаном . Что вас действительно волнует, так это файлы изображений, возвращающиеся домой, где они могут быть загружены на Facebook. На самом деле камеру, объективы и штатив нужно перевозить на Олимпиаде 1004 * и обратно. Вы также должны привести фотографа (себя), который настроит камеру и нажмет кнопку затвора. Фотограф должен перемещаться туда и обратно в относительном комфорте, поэтому вы садитесь на место, на котором фотограф будет отдыхать во время поездки. Это сиденье заключено в блестящую металлическую коробку с кучей других металлических, стеклянных и резиновых деталей, некоторые из которых вращаются и совершают возвратно-поступательное движение. В конце концов, около двух тонн вещей (и живого человека) совершают многочасовое путешествие, сжигая галлоны углеводородной жидкости - с целью передачи нескольких кусочков информации с берега в Интернет.
Точно то же самое происходит с вашим приложением. Когда пользователь хочет открыть файл с помощью диалогового окна «Открыть файл», он ожидает, что сможет:
- перейти к каталогу, содержащему файл (каталог может находиться на локальном жестком диске или CD / DVD / BR, или на сетевом диске, или в архиве и т. Д. Носитель может быть зашифрован или сжат, что необходимо отображать по-разному. Носитель может быть не подключен, для чего пользователю может потребоваться запрос. Носитель может потребовать учетные данные пользователя, которые должны быть запрошены);
- подключиться к новому каталогу, используя его URI / UNC (сопоставить диск);
- поиск в каталоге по ключевым словам;
- копировать / удалять / переименовывать некоторые файлы;
- см. Список файлов в этом каталоге;
- предварительный просмотр содержимого каждого файла в каталоге;
- выберите файл для открытия;
- передумал и решил не открывать файл;
- делать много других вещей, связанных с файлами.
ОС позволяет всему этому происходить, предоставляя вашему процессу большую часть функциональности Windows Explorer. И некоторые из них должны происходить в фоновом режиме, в противном случае пользователи будут жаловаться на то, как не отвечает диалог открытия файла. Очевидный способ запустить некоторые задачи в фоновом режиме - запустить их в разных потоках. Вот что мы видим.
А как насчет оставленных тем, спросите вы? Ну, некоторые из них оставлены там для случая, когда пользователь решит открыть другой файл: в этом случае это экономит много времени, трафика и печатает. Эта пользовательская аутентификация использовалась для этого конкретного процесса в прошлый раз? - хранится Иконки предварительного просмотра для этих надоедливых PDF-файлов? -- все еще там. Длина и битрейт для каждого фильма в каталоге? - по-прежнему доступны, не нужно их повторно анализировать.
Конечно, потоки не просто волшебным образом появляются сами по себе. Проверьте, сколько DLL было сопоставлено с процессом. Глядя на некоторые из них, можно получить довольно интересную картину того, какие функции были добавлены.
Еще один интересный способ посмотреть на это - сбросить стеки вызовов в тот момент, когда создается каждый поток. Это показывает, какая DLL (а иногда и какой объект) создал их. Вот , как x64 Win7 создает все потоки. Можно найти созданный поток фрейма Explorer; некоторые операции OLE, которые будут использоваться для создания экземпляров файловых фильтров, некоторые из которых могут генерировать значки предварительного просмотра, наложения и всплывающие подсказки; несколько потоков, принадлежащих поисковой подсистеме; перечислитель устройства оболочки (поэтому, если пользователь подключит новое устройство, оно автоматически появится в открытом диалоге); Сетевой монитор оболочки (то же самое) и другие вещи.
Хорошая новость заключается в том, что это происходит быстро и не добавляет слишком много накладных расходов вашему процессу.Большинство потоков тратят большую часть времени в ожидании некоторых редко встречающихся событий (например, при подключении USB-ключа), поэтому процессор не тратит время на их выполнение.Каждый поток потребляет 1 МБ виртуального адресного пространства в вашем процессе, но только несколько страниц по 4 КБ физической памяти.И большинство, если не все эти библиотеки DLL не использовали какую-либо полосу пропускания диска для загрузки: они уже были в ОЗУ, поэтому они просто были подключены к вашему процессу практически бесплатно.
В конце пользователь получилмножество полезных функций в пользовательском интерфейсе Snappy, в то время как процесс должен был сделать очень мало, чтобы достичь всего этого.