Как это всё ускорить?
От: Hadgi Россия  
Дата: 16.10.03 13:50
Оценка:
Это кусок моего проводника.
Всё работает, но очень медленно, если появляется желание просмотреть содержимое чего-нибудь вроде system32.
Если закомментировать ::SHGetFileInfo(...) в FillFilesList, то намного быстрее (для system32 время заполнения ListCtrl-а сокращается с 6 секунд до пары сотен милисекунд).
Но при этом иконки теряются и смотрится уже совсем не так.
Посоветуйте как это всё можно ускорить без потери наглядности.
//я пробовал вариант с FindFirstFile и FindNextFile вместо CFileFind, но время исполнения
отличается совсем мало!
struct FILE_DESCRIPTION
{
DWORD dwFileAttributes;
CString FileName;
CTime lastChangeTime;
CString FileSize;
UINT iIconIndex;
};

UINT FillFilesList()
{
FILE_DESCRIPTION fAttributes;
SHFILEINFO info;
DWORD size = sizeof(SHFILEINFO);
BOOL fFound;
CFileFind finder;
CString file_to_find = m_CurDir+"*.*";

m_pOutList->DeleteAllItems();
fFound = finder.FindFile(file_to_find);
for(nFileListSize=0; fFound; nFileListSize++)
{
fFound = finder.FindNextFile();
if(finder.IsHidden()) continue;
fAttributes.FileName = finder.GetFileName();
if(fAttributes.FileName==".") continue;

if(!finder.IsDirectory())
fAttributes.FileSize.Format("%d",finder.GetLength64());
else fAttributes.FileSize = "<DIR>";
finder.GetLastWriteTime(fAttributes.lastChangeTime);

::SHGetFileInfo(finder.GetFilePath(), 0, &info, size, SHGFI_ICON | SHGFI_SMALLICON);
fAttributes.iIconIndex = finder.IsDots()?3:info.iIcon;
InsertItem(m_pOutList, fAttributes);
}
return nFileListSize;
}

#define MAX_BUFFER 255
void InsertItem(CListCtrl *pList, FILE_DESCRIPTION file)
{
UINT iItem, iActualItem;
LVITEM lvitem;
LPTSTR subItemName;
CString str;
iItem = 0;
for(UINT iSubItem = 0; iSubItem<3; iSubItem++)
{
lvitem.iItem = iSubItem==0?iItem:iActualItem;
lvitem.iSubItem = iSubItem;
lvitem.mask = LVIF_TEXT |(iSubItem==0?LVIF_IMAGE:0);
switch(iSubItem)
{
case 0: {subItemName = file.FileName.GetBuffer(MAX_BUFFER);break;}
case 1: {subItemName = file.FileSize.GetBuffer(12); break;}
case 2: {
str = file.lastChangeTime.Format("%d.%m.%Y %H:%M");
subItemName = str.GetBuffer(15);
break;
}
}
lvitem.pszText = subItemName;
lvitem.iImage = file.iIconIndex;
if(iSubItem==0)
iActualItem = pList->InsertItem(&lvitem);
else pList->SetItem(&lvitem);
}
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.