음.. 어떻게 SHGetFileInfo()가 bottleneck 인지 아셨는지 모르겠는데 우선
while() 루프 탈출 조건이 없네요. 지금 보면 무한 루프 식으로 도는 것 같아서요. bWorking이 false가 될 때가 있는지 확인해 보시고, 그럴 경우 SHGetFileInfo() API가 어떻게 반응하는지 확인해 보세요. bWorking이 false 라면 그냥 break; 가 맞는 것 같은데 그때도 SHGetFileInfo()가 실행되고 있고요.
cstring 이기 때문에 느린 것이 아닐 것입니다.
cstring 이기 때문에 느린 것이 아닐 것입니다. 실행 중간에 빈번히 생성하거나 스트링 조작이 많다면 부하가 좀 생길수도 있습니다.
스트링 조작이라면 a = b 이런거나 형변환 같은거
스트링 조작이라면 a = b 이런거나 형변환 같은거 말씀하시는건가요?
듣기론 cstring 내부에서 많은 작업이 이루어져 작업 속도에 영향이 있을 수 있다는 말을 들었거든요
네.
네.
a = b; // 이 과정에서 a 객체가 생성되고 내용이 복사되는 과정이 필요하고요
a = a + b; // 이 과정에서 temp 객체가 생성될수도 있고, 또 기존의 a 객체의 크기가 변할수도 있습니다
아 감사합니다. 너무 느려서 그쪽인줄 알았는데
아 감사합니다. 너무 느려서 그쪽인줄 알았는데 알고보니까 SHGetFileInfo 이 api가 엄청 잡아먹네요
SHGetFileInfo를 while문에 넣어서 계속 실행하는데 이거 단축 시킬 방법은 없겟죠?
무슨 API 인지는 모르겠지만 그 자체가 느릴수도
무슨 API 인지는 모르겠지만 그 자체가 느릴수도 있고 아니면 호출 방식에 따라 그럴수도 있고요.
code snippet 을 올릴수 있으시면 참고가 될 겁니다.
CFileFind fileFileFinder;
CFileFind fileFileFinder;
BOOL bWorking = fileFileFinder.FindFile(strFileDirectoryPath + "\\*");
while (bWorking)
{
bWorking = fileFileFinder.FindNextFile();
// 상위폴더, 시스템 폴더, 숨김 폴더 제외
if (fileFileFinder.IsDots() || fileFileFinder.IsSystem() || fileFileFinder.IsHidden())
{
continue;
}
m_himagelistSystemSmall = (HIMAGELIST)SHGetFileInfo((LPCTSTR)fileFileFinder.GetFilePath(), NULL, &sstFileDirectoryInfo, sizeof(sstFileDirectoryInfo), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_DISPLAYNAME | SHGFI_SMALLICON | SHGFI_TYPENAME);
m_pSmallImage->Attach(m_himagelistSystemSmall);
m_editFileDirectoryList.SetImageList(m_pSmallImage, LVSIL_SMALL);
}
이 부분입니다. 아이콘 불러오는 곳에서 너무 오래 걸리네요
음.. 어떻게 SHGetFileInfo()가
음.. 어떻게 SHGetFileInfo()가 bottleneck 인지 아셨는지 모르겠는데 우선
while() 루프 탈출 조건이 없네요. 지금 보면 무한 루프 식으로 도는 것 같아서요. bWorking이 false가 될 때가 있는지 확인해 보시고, 그럴 경우 SHGetFileInfo() API가 어떻게 반응하는지 확인해 보세요. bWorking이 false 라면 그냥 break; 가 맞는 것 같은데 그때도 SHGetFileInfo()가 실행되고 있고요.
Attach()나 SetImageList가 이 경우 문제의 원인이 될 수도 있어요.
bWorking이 false가 되었을 때 break로 빠져나와 보세요.
원인을 찾았네요
원인을 찾았네요
m_himagelistSystemSmall = (HIMAGELIST)SHGetFileInfo((LPCTSTR)fileFileFinder.GetFilePath(), FILE_ATTRIBUTE_DIRECTORY, &sstFileDirectoryInfo, sizeof(sstFileDirectoryInfo), SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES | SHGFI_DISPLAYNAME | SHGFI_SMALLICON | SHGFI_TYPENAME);
두번째 인자에 directory인지, 파일인지를 넣어줘야하고, 그 다음에 플래그 값으로 SHGFI_USEFILEATTRIBUTES 를 넣어줘야 하네요
SHGFI_USEFILEATTRIBUTES 는 찾아보니까 설명이 전달된 dwFileAttribute를 사용합니다. 라고 돼있는데
이게 자세히 어떤 기능을 하는진 몰라서 좀 더 찾아봐야 할거 같습니다. 도움 주셔서 감사합니다
댓글 달기