Форум: "WinAPI";
Текущий архив: 2003.08.07;
Скачать: [xml.tar.bz2];
ВнизВопрос про 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.08.07;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.01 c