SHGetFileInfo 性能问题
SHGetFileInfo performance issues
以下是关于 SHGetFileInfo()
函数的 Windows 文档的摘录:
You should call this function from a background thread. Failure to do so could cause the UI to stop responding.
这是否也适用于提取文件夹图标?
我们的一个应用程序类似于 Windows Explorer,我们追求两个相互对立的目标:尽可能多地支持 Windows Explorer 的功能,并尽可能快。考虑到后者,我为每个文件夹分配了默认图标(在 SHGFI_USEFILEATTRIBUTES
标志的帮助下获得)。但过了一段时间后,我们的一些客户使用自定义文件夹图标。
那么,考虑到自定义文件夹图标的数量可以忽略不计,我应该创建新线程来计算每个文件夹的图标,还是有办法在主线程中快速提取文件夹图标?
例如,我认为仅检索缓存图标的方法可能是一种解决方案。有一个函数IShellItemImageFactory::GetImage()
,它只允许获取缓存的图标,但不幸的是returns HBITMAP
而不是HICON
。
看来我找到了合适的解决方案。
首先,我准备并存储一对包含默认文件夹图标及其在系统图像列表中的索引。然后,当文件夹图标请求到达时,我立即 return 默认图标,并从 Windows 线程池中启动一个线程。
在启动的线程中,我在 SHGetFileInfo API 的帮助下计算了实际的文件夹图标及其索引。如果索引与默认图标的索引相同,我将销毁该图标。仅当获取的索引与默认图标索引不同时,我post通知主线程中的控件。
通过这种方式,控件只会收到有关真正具有自定义图标的文件夹的通知,并且主线程不会因冗余通知而负担过重。
以下是关于 SHGetFileInfo()
函数的 Windows 文档的摘录:
You should call this function from a background thread. Failure to do so could cause the UI to stop responding.
这是否也适用于提取文件夹图标?
我们的一个应用程序类似于 Windows Explorer,我们追求两个相互对立的目标:尽可能多地支持 Windows Explorer 的功能,并尽可能快。考虑到后者,我为每个文件夹分配了默认图标(在 SHGFI_USEFILEATTRIBUTES
标志的帮助下获得)。但过了一段时间后,我们的一些客户使用自定义文件夹图标。
那么,考虑到自定义文件夹图标的数量可以忽略不计,我应该创建新线程来计算每个文件夹的图标,还是有办法在主线程中快速提取文件夹图标?
例如,我认为仅检索缓存图标的方法可能是一种解决方案。有一个函数IShellItemImageFactory::GetImage()
,它只允许获取缓存的图标,但不幸的是returns HBITMAP
而不是HICON
。
看来我找到了合适的解决方案。 首先,我准备并存储一对包含默认文件夹图标及其在系统图像列表中的索引。然后,当文件夹图标请求到达时,我立即 return 默认图标,并从 Windows 线程池中启动一个线程。
在启动的线程中,我在 SHGetFileInfo API 的帮助下计算了实际的文件夹图标及其索引。如果索引与默认图标的索引相同,我将销毁该图标。仅当获取的索引与默认图标索引不同时,我post通知主线程中的控件。
通过这种方式,控件只会收到有关真正具有自定义图标的文件夹的通知,并且主线程不会因冗余通知而负担过重。