Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос про ImageList. Освобождение памяти. [D6, WinXP]


DVM ©   (2003-06-02 11:54:00) 

Работая с ImageList, созданном на WinAPI, заметил одну неприятную вещь:

1. Запускаю программу.
2. Диспетчер задач WindowsXP показывает, что моя программа занимает в памяти 4 Мб.
3. Создаю ImageList (Как обычно - ImageList_Create(...))
4. Добавляю туда 1000 иконок.
5. Диспетчер задач WindowsXP показывает, что моя программа занимает в памяти 10 Мб.
6. Удаляю все или часть иконок из списка (ImageList_Remove(...)).
7. Диспетчер задач WindowsXP показывает, что моя программа упорно продолжает занимает в памяти 10 Мб.

В то же время уничтожение ImageList (ImageList_Destroy(...)) освобождает память до прежнего объема.

Почему не освобождается память? Если ImageList_Remove не освобождает память от иконки, то как ее освободить, не уничтожая сам ImageList?

Спасибо!


DVM   (2003-06-06 18:43:00) [1]


> VMcL ©

Спасибо. Действительно ImageList_SetImageCount "уплотняет" ImageList и тем самым память очищается. Все работает.


VMcL   (2003-06-03 17:45:00) [2]

>Morfein © (03.06.03 15:05)

Во-первых, такаяфункция есть (unit CommCtrl).
Во-вторых, выстебнулся? Win32 SDK/API help-файлы прикручены к Help"у Delphi. Никогда не замечал, что нажимая на функции, например, "OpenFile" клавишу F1, попадаешь в Win32 SDK/API Help?


Morfein   (2003-06-03 15:05:00) [3]

Во-первых, такой функции не существует...
Во-вторых, все эти функции надо "тупо" искать не в том хелпе! Это функции API и смотреть надо в хелпе Win32 Programmer"s Reference, раздел Image Lists, а не в хелпе D6.


VMcL   (2003-06-03 12:49:00) [4]

>DVM © (03.06.03 11:43)

Я потому и поставил знак вопроса - не уверен, что поможет, но можно попробовать. В Help"е ничего не написано, там этой функции вообще тупо нет (D6).


DVM   (2003-06-03 11:43:00) [5]


> VMcL ©

Сейчас нет Delphi под рукой, и возникает вопрос: а не "отсечет" ли ImageList_SetImageCount часть иконок индексы которых больше указанного. Или произойдет "уплотнение" с удалением пустых мест?


VMcL   (2003-06-03 01:59:00) [6]

ImageList_SetImageCount?


Morfein   (2003-06-03 01:03:00) [7]

Также может быть, что страницы памяти, когда-то занятые иконками, а теперь свободные, просто помечаются как зарезервированные... в случае нехватки памяти эти страницы будут помечены как свободные и перейдут в общее распоряжение...


DVM   (2003-06-02 16:31:00) [8]

Что ж сам себе отвечу. Может я не прав.
Похоже, что ImageList хранит все иконки одним большим куском, и просто выделяет часть из него, если требуется какая-то иконка. Поэтому удалив одну иконку мы не очищаем память, где иконка хранилась. Очищается она только похоже вместе с ImageList.

"Сжать, уплотнить" ImageList тоже похоже нельзя. Придется использовать промежуточный, временный ImageList для перекидывания туда иконок, удаления основного ImageList и обмена их местами впоследствии. Или есть другой способ?


DVM   (2003-06-02 13:11:00) [9]

Загружал в цикле, примерно так:

for i:=0 to ... do
begin
hIcon:=ExtractAssociatedIcon(...);
ImageList_AddIcon(himlLarge, hIcon);
DestroyIcon(hIcon);
end;

Здесь все должно быть нормально.

Но вот как удалить из ImageList с освобождением памяти?
Вот так не проходит (память не освобождается)
DestroyIcon(ImageList_GetIcon(himlLarge,nItem,ILD_NORMAL or ILD_MASK));
ImageList_Remove(himlLarge,nItem);
т. к. я думаю эта функция создает еще один HIcon.


Cobalt   (2003-06-02 12:21:00) [10]

А как ты загружал в ImageList иконки?
З.Ы. может, DestroyIcon поможет?


Наверх

Титульная страница Поиск, карта сайта Написать письмо