Optimieren von Funktion
-
Hi Leute ich bin mir zwar nicht ganz sicher ob es das richtige Forum ist,
aber ich schildere hier mal mein Problem:
Ich habe eine Funktion geschrieben die mir den Inhal eines Verzeichnis ausgibt.
Es ist in einem eigenen Thread arbeitet mir aber zu langsam! Wie kann ich das ändern (optimieren)?Form5->ListView1->Items->Clear(); WIN32_FIND_DATA filedata; AnsiString slVolumeName; DWORD dwVolumeSerial; HANDLE filehandle; SYSTEMTIME stcUTC,stLocal; DWORDLONG filesize; int pos,i=0; float size; String groesse,date,minute,hour,typ,dir=pfad; WORD nummer; TIcon *MyIcon = new TIcon(); Form5->ListIcons->Clear(); Form5->ListIcons->BkColor= (TColor)0x00FFFFFF; //Transparenz Form5->LargeIcons->Clear(); Form5->LargeIcons->BkColor= (TColor)0x00FFFFFF; //Transparenz if(Tree->IsDiskInDrive(dir,slVolumeName,dwVolumeSerial)){ filehandle = FindFirstFile((dir+"\\*.*" ).c_str(), &filedata); bool found = (filehandle != INVALID_HANDLE_VALUE); while (found == true) { String file=filedata.cFileName; if (((filedata.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) == 0) && (file != ".") && (file != "..")){ TListItem *Subfolder = Form5->ListView1->Items->Add(); //Dateiname Subfolder->Caption=file; //Icon String lol=dir+"\\"+file; lol=ReplaceStr(lol,"\\\\","\\"); MyIcon->Handle=ExtractAssociatedIcon(Form5->Handle,lol.c_str(),&nummer); if(MyIcon->Handle!=NULL) { Form5->LargeIcons->AddIcon(MyIcon); Form5->ListIcons->AddIcon(MyIcon); } Subfolder->ImageIndex=i; i++; //FileTime FileTimeToSystemTime(&filedata.ftLastWriteTime,&stcUTC); SystemTimeToTzSpecificLocalTime(NULL, &stcUTC, &stLocal); if(stLocal.wMinute<10){ minute="0"+IntToStr(stLocal.wMinute); }else{ minute=IntToStr(stLocal.wMinute); } if(stLocal.wHour<10){ hour="0"+IntToStr(stLocal.wHour); }else{ hour=IntToStr(stLocal.wHour); } date=IntToStr(stLocal.wDay)+"."+IntToStr(stLocal.wMonth)+"."+IntToStr(stLocal.wYear)+" "+hour+":"+minute; Subfolder->SubItems->Add(date); if((filedata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ==0){ //Typ pos=LastDelimiter(".",filedata.cFileName); typ=String(filedata.cFileName); typ=typ.Delete(1,pos); if(typ=="Ink"){ Subfolder->SubItems->Add("Verknüpfung"); }else{ Subfolder->SubItems->Add(typ+"-Datei"); } //Größe hierher size=filedata.nFileSizeLow; SetRoundMode(rmDown); if(size<1024){ groesse=FloatToStr(size)+" Bytes"; }else if(size>=1024 && size<1048576){ size=RoundTo(size/1024,-2); groesse=FloatToStrF(size,ffGeneral,4,DecimalSeparator)+" KB"; }else if(size>=1048576 && size<1073741824){ size=RoundTo(size/1024/1024,-2); groesse=FloatToStrF(size,ffGeneral,4,DecimalSeparator)+" MB"; }else if(size>=1073741824){ // stimmt das?? size=filedata.nFileSizeHigh*4+size/1024/1024/1024; groesse=FloatToStrF(size,ffGeneral,4,DecimalSeparator)+" GB"; }else{ groesse="[Dateigröße konnte nicht bestimmt werden]"; } Subfolder->SubItems->Add(groesse); }else{ Subfolder->SubItems->Add("Verzeichnis"); Subfolder->SubItems->Add("[-]"); } } else { } found = FindNextFile(filehandle, &filedata); } if(Form5->ListView1->Items->Count!=0){ Form5->ListView1->Items->operator [](0)->Selected=true; Form5->ListView1->Focused(); } FindClose(filehandle); DestroyIcon(MyIcon); }Grüße XBert
-
XBert schrieb:
Wie kann ich das ändern (optimieren)?
Anfangen kannst du, indem du einzelne Abschnitte auskommentierst und mittels wiederholter Durchläufe prüfst, bei welcher Aktion die meiste Zeit draufgeht.
Ausserdem solltest du mal einen Blick auf das VirtualListView-Projekt im examples-Verzeichnis werfen.
-
ich weiß ja was am längsten braucht : die Icons holen
Ich will ja das mit den Icons optimieren denn wenn ich zu bsp den System32-ordner auslese dauert das zwischen 20 u 30 sekunden (und das ist viel zu lang)
-
Du fügst bei bei allen Dateien das Icon in die Imagelist, dass lässt sich Optimieren indem du vorab die Icons in die ImageList lädst.
ala
//Einlesen der Systemicons in das ImageListFileSymbols SHFILEINFO SHFileInfo; //kleine Symbole DWORD ImageHandle = SHGetFileInfo("", 0, &SHFileInfo, sizeof(SHFileInfo), SHGFI_SMALLICON|SHGFI_SHELLICONSIZE|SHGFI_SYSICONINDEX); if (ImageHandle != 0) { m_ImageList->Handle = ImageHandle; m_ImageList->ShareImages = true; } //grosse Symbole DWORD ImageHandle32 = SHGetFileInfo("", 0, &SHFileInfo, sizeof(SHFileInfo), SHGFI_ICON|SHGFI_SHELLICONSIZE|SHGFI_SYSICONINDEX); if (ImageHandle32 != 0) { m_ImageList32->Handle = ImageHandle32; m_ImageList32->ShareImages = true; }und dann drauf verweisst mittels
AnsiString File = item.Path + "\\" + sr.Name; DWORD result = SHGetFileInfo(File.c_str(), 0, &info, sizeof(info), SHGFI_ICON | SHGFI_SMALLICON); if (result != 0) Subfolder->ImageIndex= info.iIcon;
-
Danke das funktionier eigentlich ganz gut außer das bei manchen Ordnern keine Icons angezeigt werden.
(Kann ich die Sys-Icons beim FormCreate kopieren oder in der Funktion)