![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос про 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 поможет?