Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.07;
Скачать: CL | DM;

Вниз

Вопрос про ImageList. Освобождение памяти.   Найти похожие ветки 

 
DVM ©   (2003-06-02 11:54) [0]

Работая с 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?

Спасибо!


 
Cobalt ©   (2003-06-02 12:21) [1]

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


 
DVM ©   (2003-06-02 13:11) [2]

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

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.


 
DVM ©   (2003-06-02 16:31) [3]

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

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



 
Morfein ©   (2003-06-03 01:03) [4]

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


 
VMcL ©   (2003-06-03 01:59) [5]

ImageList_SetImageCount?


 
DVM ©   (2003-06-03 11:43) [6]


> VMcL ©

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


 
VMcL ©   (2003-06-03 12:49) [7]

>DVM © (03.06.03 11:43)

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


 
Morfein ©   (2003-06-03 15:05) [8]

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


 
VMcL ©   (2003-06-03 17:45) [9]

>Morfein © (03.06.03 15:05)

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


 
DVM ©   (2003-06-06 18:43) [10]


> VMcL ©

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



Страницы: 1 вся ветка

Текущий архив: 2003.08.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
1-20516
j10
2003-07-25 15:26
2003.08.07
как получить путь и имя COM сервера? например Word.Application


3-20437
Klim Samgin
2003-07-17 08:55
2003.08.07
Изменение типа поля


1-20462
Bosh
2003-07-23 05:53
2003.08.07
TiniFiles


14-20689
vidiv
2003-07-20 13:39
2003.08.07
Как грамотно на PHP узнать какой браузер у клиента?


3-20454
Nikolai_S
2003-07-17 15:40
2003.08.07
Проблема с Lookup полями в ADO с MS SQL Server