讨论:Windows 资源管理器在显示文件类型图标时的效率分析,怎样突破效率瓶颈??

CCED136 2004-07-19 06:11:27
最近,我在写一个类似 Windows 资源管理器功能的文件浏览模块时,发现

如下现象:在 windows2000 server 环境下,使用 Windows 资源管理器浏览

系统目录 c:\winnt\system32 中的文件,耗时大约 1000 毫秒,可是,自己

的代码(纯 WIN32 API)完成浏览该目录的文件,却需要时间 3500 - 9000

毫秒。根据分析,时间耗费主要是获取文件类型图标部分,

代码中也就是函数 SHGetFileInfo 部分。我做了如下测试代码:

DWORD WINAPI Test(void)
{
SHFILEINFO mSFI;

DWORD dwStart = GetTickCount();
{
for(int i=0; i<10000; ++i)
{
SHGetFileInfo("C:\\WINNT\\SYSTEM32\\RUNDLL32.EXE",
0, &mSFI, sizeof(SHFILEINFO),
SHGFI_SMALLICON|SHGFI_SYSICONINDEX);
}
}
return (GetTickCount() - dwStart);
}

返回数值大约在 4500 - 5500 之间。

=================================================================
我的机器是 P4-M 1.4G 笔记本
...全文
137 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
CCED136 2004-07-20
  • 打赏
  • 举报
回复
研究ing......

cczlp 2004-07-20
  • 打赏
  • 举报
回复
我做过类似资源管理器的,速度与explorer差不多,参考的就是VirtualListview的例子。建议楼主看看。
CCED136 2004-07-20
  • 打赏
  • 举报
回复
2: RamjetZhang(王小桃)

说说操作 ShellIconCache 的基本方法,还有,可能出现怎样的问题?

出现的问题应该怎样去避免或者解决。
CCED136 2004-07-20
  • 打赏
  • 举报
回复

大家怎么了?瞧不起这 200 分,还是想自己保留技术(技巧)???
RamjetZhang 2004-07-19
  • 打赏
  • 举报
回复
windows的explorer是有图标缓存的,对不同扩展名的文件事先取好图标储存起来(ShellIconCache)的(不用一个文件一个文件的去抠图标);缺点是有时ShellIconCache会出点bug,图标不能及时更新或者有错;
qdsql 2004-07-19
  • 打赏
  • 举报
回复
还得多实践
Siney 2004-07-19
  • 打赏
  • 举报
回复
获取文件图标是使用系统图标的cache的,不能每个文件都自己获得图标,否则慢死你,同意楼上的例子,自己仔细研究吧。
JetKingLau 2004-07-19
  • 打赏
  • 举报
回复
看看 BCB6 的 Examples\VirtualListView\VirtualListview.bpr 例子,这个函数蛮快的。

void __fastcall TfrmVirtualLView::tlbtnBrowseClick(TObject *Sender)
{
AnsiString S;
S = "";
if (SelectDirectory("Select Directory", "", S))
SetPath(S);//打开 C:\Windows\System32 只用了不到 300。
}

你去研究下 SetPath(...) 看看。


偶的机器:P4 2.4 + Win XP Pro SP1 + 256M + 32M GeForce2 MX 400
myy 2004-07-19
  • 打赏
  • 举报
回复
http://www.2ccc.com/article.asp?articleid=1277

这是我以前写的扫描磁盘的小程序,里面用到一个别人写的TImageListEx.pas
的文件(直接用的,不是控件),对于取系统的图标有很好的封装。


如果你需要,但不能下载,可留e-mail
myy 2004-07-19
  • 打赏
  • 举报
回复
如果要求低点,只要文件“类型”的图标(比如所有exe显示同样的默认图标)即:

SHGetFileInfo("C:\\WINNT\\SYSTEM32\\RUNDLL32.EXE",
FILE_ATTRIBUTE_NORMAL, &mSFI, sizeof(SHFILEINFO),
SHGFI_SMALLICON|SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES);

速度会快很多。
constantine 2004-07-19
  • 打赏
  • 举报
回复
我的要3-4秒,大汗
robbyzi 2004-07-19
  • 打赏
  • 举报
回复
突破效率瓶颈???!!!!!

也许要 P5 才可以了。。呵呵。。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧