Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.009 c
9-20367
Esc
2003-02-07 13:57
2003.08.07
Динамические массивы или списки?


7-20831
Александр
2003-05-26 08:52
2003.08.07
Изменить шрифт


3-20406
Филипп
2003-07-16 14:04
2003.08.07
База данных ACCESS


1-20605
Dead Stark
2003-07-24 10:33
2003.08.07
GB-2312 -> HZ-GB-2312.... Как?


3-20457
AlexWeb
2003-07-17 12:18
2003.08.07
Помогите с Клиент-Сервером





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский