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

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

LoadLibraryEx и FreeLibrary [D6, Win2k]


Jel ©   (2004-05-30 19:12:00) 

Есть код.

 hModule := LoadLibraryEx(pchar(FileName),0, LOAD_LIBRARY_AS_DATAFILE);
 if hModule <> 0 then begin
   ...
   FreeLibrary(hModule);
 end;


Используется он для работы с ресурсами большого количества файлов. Работает, но - при работе в диспетчере задач видно неуклонное увеличение объема памяти, выделяемой приложению. Когда объемы становятся неприличными (более 100 мегабайт) система естественно начинает активно использовать файл подкачки.
Однако когда обработка ресурсов завершается - объем памяти резко уменьшается.

Вопрос - когда система реально выгружает модуль освобожденный по FreeLibrary? Сразу после вызова или делает какую-то задержку? Или нужно отдавать часть процессорного времени системе чтобы она успевала выгружать ненужные больше модули?


Piter   (2004-05-30 23:31:00) [1]

Jel (30.05.04 22:25) [11]
Нашел таки кусок кода при обходе которого память не растет


все таки утечка :)


Jel   (2004-05-30 22:25:00) [2]

Вопрос снят. Нашел таки кусок кода при обходе которого память не растет. Дело не в вызовах API. Сорри :)


DVM   (2004-05-30 22:17:00) [3]


> Jel ©   (30.05.04 22:07) [8]

А иконки куда деваются? Там иконок дай боже. В папке Windows. Они куда попадают? Какой функцией извлекаются? После скана что с ними происходит?
Код сканирования хорошо бы привести.


Piter   (2004-05-30 22:12:00) [4]

Jel (30.05.04 22:07) [8]

можно поподробнее? Как я просил... типа загружается библиотека... находится то-то... и т.д.


Jel   (2004-05-30 22:07:00) [5]


> А расскажи алгоритм.

Банальный грабер иконок. PE файлы грузятся с помощью LoadLibrayEx, из них добываются иконки и отдаются юзеру на растерзание. Разбирать секцию ресурсов PE ручками показалось непрактичным ибо есть подходящие функции API. При сканировании например папки Windows память плавно растет и достигает ~120 mb! Создается впечатление что однажды загруженные ресурсы оттуда не выгружаются. По окончании сканирования можно свернуть-развернуть окно приложения и получить ~2 mb. Если похлопать окошком в процессе сканирования - объем выделенной памяти уменьшается не столь значительно. (раза в полтора-два).


Piter   (2004-05-30 21:39:00) [6]

А расскажи алгоритм.

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

И на каком этапе начинает занимать очень много памяти? И после какого этапа память уменьшается?


Jel   (2004-05-30 21:29:00) [7]


> Piter ©   (30.05.04 21:14) [5]

Обрабатываются тысячи файлов. Но загружаются не одонвременно, а последовательно. Похоже что выгружаются все-таки не сразу. Утечки вроде бы нет, проверял. К тому же после окончания обработки объем занимаемой памяти уменьшается до приемлемых величин (в 10-15 раз).


Piter   (2004-05-30 21:14:00) [8]

Jel (30.05.04 20:39) [4]
Вот работа этого кэша видимо и ощущается.


вряд ли.

. Когда объемы становятся неприличными (более 100 мегабайт)

откуда были бы такие цифры? У тебя то ли утечка ресурсов, то ли еще что-то. Конечно, после FreeLibrary библиотека физически может быть и не выгружена, но память процесс должен занимать меньше...


Jel   (2004-05-30 20:39:00) [9]


> Piter ©   (30.05.04 20:34) [2]

Вот работа этого кэша видимо и ощущается.
А можно ли его сбросить принудительно?


Jel   (2004-05-30 20:38:00) [10]


> VMcL ©   (30.05.04 20:33) [1]

RT_ICON, RT_GROUP_ICON
Опциями не интересовался.

Получаю указатель на блок памяти стандартным вызовом
FindResource->LoadResource->LockResource
Делаю с ним то, что мне нужно и FreeLibrary.


Piter   (2004-05-30 20:34:00) [11]

Jel (30.05.04 19:12)
Вопрос - когда система реально выгружает модуль освобожденный по FreeLibrary?


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

Когда же физически будет выгружена - вопрос никому не известный, кроме windows. Тут используется хитроумная система кеширования и т.л., которая различается в разных версиях windows


VMcL   (2004-05-30 20:33:00) [12]

>>Jel ©  (30.05.04 19:12)

Какие типы ресурсов? Каковы их опции (MOVEABLE, DISCARВABLE и т. п.)?


Наверх

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