Текущий архив: 2004.02.13;
Скачать: CL | DM;
Вниз
Вопрос по Virtual ListView Найти похожие ветки
← →
Lin7 (2003-11-23 10:49) [0]Доброго времени суток.
Делаю следующее:
1. Компилирую и запускаю из папки Demo проект Virtual Listview.
2. Открываю TaskManager.
3. Начинаю лазить по папкам в Virtual ListView и с удивлением и недовольством обнаруживаю, что объём памяти занимаемой процессом virtuallistview.exe постояно растёт. :(
Ликвидируйте, pls., мою безграмотность. Это что??
Действительно утеска ресурсов? Как избавиться?
Или TaskManager нагло врёт?
Вопрос не из праздного любопытства - в моей программе то же самое. :((
Предположительно дело в SHGetFileInfo.
Хотелось бы услышать мнения профи.
У меня Windows XP и D6, D7.
P.S. Если не затруднит продублируйте ответ на мыло. Спасибо.
← →
Rouse_ © (2003-11-23 11:05) [1]Нет не врет...
Действительно в данном примере есть т.н. утечка памяти...
← →
Lin7 (2003-11-23 19:34) [2]для Rouse_ ©: Гм... Всё это конечно классно, но что делать? Предполагается, что моей программой юзер будет пользоваться в течении всего сеанса работы с виндой, а она разбухает со скоростью бешенной черепахи. :) В Total Commander"е я ничего подобного не замечал, хотя там тоже извлекаются иконки файлов...
Автор вопроса.
← →
Rouse_ © (2003-11-24 13:53) [3]В принципе ничего страшного нет, так как при завершении программы все ресурсы освобождаются корректно, а прирост памяти наблюдается здесь:
// don"t delete the stock font
FOurFont := CreateFontIndirect(LogFont);
И еще в некоторых местах...
Желаю успехов
← →
Lin7 © (2003-11-25 18:37) [4]для Rouse_ ©: В моей проге прирост существенный. По крайней мере через полчаса-час работы и меня это никак не устраивает.
У меня утечка только на SHGetFileInfo. Я её использую для извлечения иконки из файла(точно так же как реализовано в Virtual ListView). Может быть есть другой способ извлечь иконку 16х16 из файла? Блин, ну работает же Total Commander без таких приколов!!!
Автор вопроса.
← →
Dimka Maslov © (2003-11-26 09:00) [5]Читаем MSDN:
If SHGetFileInfo returns an icon handle in the hIcon member of the SHFILEINFO structure pointed to by psfi, you are responsible for freeing it with DestroyIcon when you no longer need it.
← →
Lin7 © (2003-11-26 15:23) [6]для Dimka Maslov: делал и DestroyIcon и использовал системный ImageList один чёрт...
Подозреваю, что народ попросит исходники - гляньте Virtual ListView в Demo у Delphi - я всё делал точно так же.
Автор вопроса.
← →
Rouse_ © (2003-11-26 16:32) [7]> Может быть есть другой способ извлечь иконку 16х16 из файла?
ExtractAssociatedIcon
Только не уверен насчет 16х16
Желаю успехов
← →
frost © (2003-11-29 09:16) [8]Для Lin7 - если Вы как то решили проблему, напишите если не жалко. Спасибо!
← →
Lin7 © (2003-11-30 12:58) [9]для frost: Мне то не жалко, но не решил... :(((
для Rouse: Мне кроме иконок файлов по их пути нужно извлекать иконки рабочего стола, корзины и др. по PIDL, т.е. функция SHGetFileInfo всё это делает, а ExtractAssociatedIcon извлекает иконки только по пути файла... Спасибо.
Люди HELP!!!!! Уже кучу времени убил и всё безрезуьтатно!!!!
Автор вопроса.
← →
Lin7 © (2003-12-01 19:09) [10]Люди HELP!!!!! Уже кучу времени убил и всё безрезуьтатно!!!!
Автор вопроса.
← →
jonni © (2003-12-01 22:40) [11]http://www.automatedqa.com/downloads/memproof.asp
eta programma konkretno tebe ukazhet dazhe nomer stroki gde utechki i oshibki
← →
Lin7 © (2003-12-03 13:35) [12]MemProof хорошая программа, она говорит - утечек нет. Дык... ведь TaskManager показывает постоянный прирост памяти. Расход памяти (если верить TaskManager"у) увеличивается существенно. В Total Commander"е такого и в помине нет, в проводнике винды, когда захожу в папку - память растёт - вышел назад - вернулась на базу. А вот в Virtual ListView не возращается. :( И в моей проге то же самое :(((( Больно умные юзеры, умеющие запускать TaskManager и находить мой процесс :) начинают нервничать.
← →
KosilkA © (2003-12-03 14:42) [13]самое интересное - программа жрет память не только если шастать по папкам, но и после простого перемещения формы мышкой - ресурсы памяти продолжают убывать . Прибил все события связанные с ListView"ом - не помогло .. у самой же формы только два события - onclose и oncreate . Если форму свернуть - размер занятой памяти уменьшаются до 352 кБ , если ее снова развернуть - память опять увеличивается , но уже не до 3000 кб как было, а до ~1280 ... и прога снова начинает отбирать помаленьку , пока опять не свернешь.
← →
DVM © (2003-12-03 21:14) [14]Забейте на этот прирост. Память жрет системный ImageList, причем эта память им занятая приписывается и вашей программе. Освобождать память от иконки он не освобождает, т.к. стремится достичь максимальной производительности. Уничтожить его тоже нельзя. Совет один - не использовать его, а иконки получать самому и самому же освобождать.
← →
Lin7 © (2003-12-08 10:17) [15]для KosilkA: интересненько...
для DVM: я поначалу так и решил: "Память жрет системный ImageList...", переписал - использовал SHGetFileInfo для извлечения иконки и DestroyIcon для уничтожения - ситуация ни на йоту не изменилась, память по прежнему просто улетает...
Автор вопроса.
← →
DVM © (2003-12-08 18:09) [16]
> использовал SHGetFileInfo для извлечения иконки и DestroyIcon
> для уничтожения
Это все равно системный ImageList - он неявно "присоединяется к программе" использующей SHGetFileInfo для извлечения иконок. Я с этим боролся долгое время. Как оказалось простой вызов этой функции в программе для извлечения иконки все равно возвращает хэндл системного ImageList (или его копию). Но он обладает нехорошим свойством - при удалении иконок из него он не ужимаентся в памяти.
Потом я переделал все то же самое на стандартный ImageList. Саи извлекал, сам добалял, сам удалял и менял размеры ImageList-а. Все стало работать как часы: при добалении память плюсуется - при удалении ровно столько же удаляется. Самое сложное - удалить иконку из середины ImageList.
← →
Lin7 © (2003-12-09 17:18) [17]для DVM:
>Потом я переделал все то же самое на стандартный ImageList.
>Саи извлекал, сам добалял, сам удалял...
А иконки чего? Файлов? Если да, может исходником поделишься?
Или расскажи как извлечь иконку по PIDL, чтобы она не попала в системный ImageList.
Автор вопроса.
Страницы: 1 вся ветка
Текущий архив: 2004.02.13;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.031 c