[問題] 撰寫"開啟檔案"功能時縮圖的問題

看板C_and_CPP作者 (15357)時間11年前發表 (2014/04/29 13:09), 11年前編輯推噓5(5017)
留言22則, 1人參與, 最新討論串1/1
不好意思,小弟目前再用Qt寫一程式時, 因為XP系統的開啟檔案似乎沒辦法預設就是縮圖模式 如圖:http://ppt.cc/Nmm5 必須要從紅圈處改成縮圖才可以 所以必須要寫一個開檔功能應用在XP上 (老闆堅持用XP...) 目前已經做到可以在List上顯示該目錄下的所有檔案類型 如圖:http://ppt.cc/fWTL 但對於縮圖的實做上有些問題想請教 目前置作縮圖的方法是將目錄上的所有檔案都過濾, 只顯示屬於圖檔的部分,接著去讀取每一張圖,然後呼叫函式縮小 最後再放到List上,但這樣有一個問題是每前進一個目錄 我的程式都會Delay直到該目錄下所有圖片都縮完並顯示為止 如果圖片有20張,我程式大概會有2~3秒不能動 本來想說用執行緒的方式去實作,還沒縮完的圖檔都用系統預設的Icon 縮完一張圖片在更新一個ListItem,像這個樣子 http://ppt.cc/Mvpi 可是還沒去實作就又想到一個問題,就是當圖片過大時, 開檔並縮小的時間就越長,可是看了一下Win7的縮圖功能,卻都是神之快 不管我圖片在大,每當進入資料夾後,系統製作縮圖的速度真的超迅速 而且我程式在進行縮圖的過程中,程式記憶體會標很高, 甚至很容易出現"記憶體不足"的錯誤, 但看了一下系統管理員卻還有好幾G的記憶體可用,也滿莫名其妙的 所以又感覺自己的方向不對,想請教一下各位高手, 能否給小弟一點方向、建議或提示,該怎麼做才可以快速產生縮圖 還是說有辦法直接去讀取XP、win7系統中該圖片的thumbnail cache 或者XP有辦法調成預設開啟檔案就是縮圖模式ˇ_ˇ 謝謝各位 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 49.158.60.5 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1398776952.A.335.html ※ 編輯: googled (49.158.60.5), 04/29/2014 21:09:32

04/29 21:16, , 1F
Windows 的縮圖快取可以透過 IExtractImage 來獲得
04/29 21:16, 1F

04/29 21:17, , 2F
這篇雖不是 C++ 的範例 http://goo.gl/N7RLlz 仍可參考
04/29 21:17, 2F
好的,感謝你的幫忙,我再來看看有沒有辦法跟Qt結合

04/29 21:23, , 3F
至於記憶體不足,除了 memory leak 有些該釋放沒釋放
04/29 21:23, 3F

04/29 21:23, , 4F
還有一種可能就是圖片太大,難以配置到連續的記憶體空間
04/29 21:23, 4F
我看了一下記憶體的變化,我進入到140m的照片資料夾後,讀取的記憶體卻高達1G多 還滿奇怪的,不過我程式確實就當掉了,看了一下工作管理員的記憶體 "可用"還有2G多,"未使用"只剩不到一百,然後"可用"慢慢的減少 "未使用"卻在慢慢的增加,我在想會有可能會是程式讀取圖片太快, 系統轉換記憶體太慢導致當掉的嗎? 對作業系統不是很熟ˇ_ˇ

04/29 21:32, , 5F
至於讓 XP 直接顯示 thumbnail view 應該沒直接的方式
04/29 21:32, 5F

04/29 21:33, , 6F
倒是這兒有一篇文章提到,有一些特殊技巧可以辦到 :P
04/29 21:33, 6F

04/29 21:33, , 7F
http://goo.gl/lm3hnw 自己 SendMessage 給 dialog 囉
04/29 21:33, 7F

04/29 21:50, , 8F
SendMessage(hWnd, WM_COMMAND, ODM_VIEW_THUMBS, 0);
04/29 21:50, 8F
剛剛立刻GOOGLE查QT使用SendMessage的方法測試了一下, 但卻FileDialog卻沒有反應,本身也沒學過WIN32,使用的方法也不知道對不對 #include <windows.h> QFileDialog fileDialog; ::SendMessageW( (HWND)fileDialog.winId(), WM_COMMAND, 0x702b, 0); fileDialog.exec(); 不過一直覺得這方法是最下策,總覺得這樣算是偷吃步,並不是真正解決問題 雖然有完成需求才是最重要的...

04/29 21:53, , 9F
還有如果自己 decode 會卡住,是因為 UI thread 被卡住
04/29 21:53, 9F

04/29 21:55, , 10F
會卡 UI 的任務,都該放到 worker thread 非同步執行
04/29 21:55, 10F

04/29 21:56, , 11F
待任務完成之後,再通知 UI thread 更新畫面之類的
04/29 21:56, 11F
我發現我文章要打"執行緒"卻打成"副程式",哈哈 感謝L大的指導以前英文沒學好,第一篇文章明天放學要來慢慢邊翻譯邊看了 感謝你 ※ 編輯: googled (49.158.60.5), 04/30/2014 00:19:38 ※ 編輯: googled (49.158.60.5), 04/30/2014 00:20:19

04/30 00:50, , 12F
雖然我沒有真的測試,但根據 MSDN 那篇文章的描述
04/30 00:50, 12F

04/30 00:50, , 13F
SendMessage 在特定情況才會成功,其他狀況會失敗
04/30 00:50, 13F

04/30 00:51, , 14F
可能要做一下 Hook 在 init dialog 時,送 PostMessage
04/30 00:51, 14F

04/30 00:52, , 15F
給 FileDialog 自己,然後再該時機點去改變排序的類型
04/30 00:52, 15F

04/30 00:55, , 16F
觀察記憶體用量請用 procexp.exe http://goo.gl/n7utTE
04/30 00:55, 16F

04/30 00:56, , 17F
搭配下 debug break point 來幫助自己釐清哪些階段增加
04/30 00:56, 17F

04/30 00:56, , 18F
procexp 使用時,請直接針對你的 process 點兩下來觀察
04/30 00:56, 18F

04/30 00:59, , 19F
如果可以直接改 dialog 排序達成目的當然是最快
04/30 00:59, 19F

04/30 01:00, , 20F
其次是 IExtractImage 這方法得懂一些 COM 操作
04/30 01:00, 20F

04/30 01:00, , 21F
自己 decode 圖片,除非是特殊需求 (如要顯示 RAW 檔)
04/30 01:00, 21F

04/30 01:01, , 22F
不然寫的好可是不簡單的任務... 大概是這樣 :)
04/30 01:01, 22F
文章代碼(AID): #1JNwHuCr (C_and_CPP)