유니코드에 대해서 궁금한게 있습니다

ljs0652의 이미지

유니 코드 개발을 하고 있는데

현재 저는 mfc에서 왠만한 변수는 다 cstring으로 하고 있는데요

이게 좀 속도에 문제를 일으키는거 같아서 바꿔보려고 합니다

보통 유니코드로 쓰면 변수 tchar랑 wcharㅇ ㅣ있는거 같은데

어느걸 쓰는게 더 유리한가요???

라스코니의 이미지

cstring 이기 때문에 느린 것이 아닐 것입니다. 실행 중간에 빈번히 생성하거나 스트링 조작이 많다면 부하가 좀 생길수도 있습니다.

ljs0652의 이미지

스트링 조작이라면 a = b 이런거나 형변환 같은거 말씀하시는건가요?
듣기론 cstring 내부에서 많은 작업이 이루어져 작업 속도에 영향이 있을 수 있다는 말을 들었거든요

라스코니의 이미지

네.
a = b; // 이 과정에서 a 객체가 생성되고 내용이 복사되는 과정이 필요하고요
a = a + b; // 이 과정에서 temp 객체가 생성될수도 있고, 또 기존의 a 객체의 크기가 변할수도 있습니다

ljs0652의 이미지

아 감사합니다. 너무 느려서 그쪽인줄 알았는데 알고보니까 SHGetFileInfo 이 api가 엄청 잡아먹네요

SHGetFileInfo를 while문에 넣어서 계속 실행하는데 이거 단축 시킬 방법은 없겟죠?

라스코니의 이미지

무슨 API 인지는 모르겠지만 그 자체가 느릴수도 있고 아니면 호출 방식에 따라 그럴수도 있고요.
code snippet 을 올릴수 있으시면 참고가 될 겁니다.

ljs0652의 이미지

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()가 bottleneck 인지 아셨는지 모르겠는데 우선

while() 루프 탈출 조건이 없네요. 지금 보면 무한 루프 식으로 도는 것 같아서요. bWorking이 false가 될 때가 있는지 확인해 보시고, 그럴 경우 SHGetFileInfo() API가 어떻게 반응하는지 확인해 보세요. bWorking이 false 라면 그냥 break; 가 맞는 것 같은데 그때도 SHGetFileInfo()가 실행되고 있고요.

Attach()나 SetImageList가 이 경우 문제의 원인이 될 수도 있어요.

bWorking이 false가 되었을 때 break로 빠져나와 보세요.

ljs0652의 이미지

원인을 찾았네요

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를 사용합니다. 라고 돼있는데

이게 자세히 어떤 기능을 하는진 몰라서 좀 더 찾아봐야 할거 같습니다. 도움 주셔서 감사합니다

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.