Проблемы с производительностью SHGetFileInfo - PullRequest
0 голосов
/ 21 января 2019

Вот выдержка из документации Windows о функции SHGetFileInfo():

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

Это относится и к извлечению значков папок?

Одно из наших приложений напоминает Windows Explorer, и мы преследуем две антагонистические цели: поддерживать как можно больше функций Windows Explorer и быть максимально быстрыми. Имея в виду последнее, я назначил каждой папке значок по умолчанию (полученный с помощью флага SHGFI_USEFILEATTRIBUTES). Но через некоторое время оказалось, что некоторые наши клиенты используют собственные значки папок.

Итак, нужно ли создавать новые потоки для расчета значка для каждой папки или есть способ быстро извлечь значок папки в главном потоке, учитывая тот факт, что количество пользовательских значков папок незначительно?

Например, я думаю, например, способ извлечения только кэшированных значков может быть решением. Есть функция IShellItemImageFactory::GetImage(), которая позволяет получать только кэшированные иконки, но, к сожалению, возвращает HBITMAP вместо HICON.

1 Ответ

0 голосов
/ 11 февраля 2019

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

В запущенном потоке я вычисляю реальный значок папки и ее индекс с помощьюAPI SHGetFileInfo.Если индекс совпадает с индексом значка по умолчанию, я уничтожаю значок.Только если полученный индекс отличается от индекса значков по умолчанию, я отправляю уведомление элементу управления в главном потоке.

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

...