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

Вниз

LoadLibraryEx и FreeLibrary   Найти похожие ветки 

 
Jel ©   (2004-05-30 19:12) [0]

Есть код.

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


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

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


 
VMcL ©   (2004-05-30 20:33) [1]

>>Jel ©  (30.05.04 19:12)

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


 
Piter ©   (2004-05-30 20:34) [2]

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


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

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


 
Jel ©   (2004-05-30 20:38) [3]


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

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

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


 
Jel ©   (2004-05-30 20:39) [4]


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

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


 
Piter ©   (2004-05-30 21:14) [5]

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


вряд ли.

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

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


 
Jel ©   (2004-05-30 21:29) [6]


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

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


 
Piter ©   (2004-05-30 21:39) [7]

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

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

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


 
Jel ©   (2004-05-30 22:07) [8]


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

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


 
Piter ©   (2004-05-30 22:12) [9]

Jel (30.05.04 22:07) [8]

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


 
DVM ©   (2004-05-30 22:17) [10]


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

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


 
Jel ©   (2004-05-30 22:25) [11]

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


 
Piter ©   (2004-05-30 23:31) [12]

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


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



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

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

Наверх




Память: 0.49 MB
Время: 0.04 c
8-1082905956
iudjen
2004-04-25 19:12
2004.07.11
image OnMauuseEnter - Leave


6-1084507754
OlegM
2004-05-14 08:09
2004.07.11
Как определить что на компе другом запущен сервер


8-1082609276
hellfire
2004-04-22 08:47
2004.07.11
TAnimate и AVI-файл, вкомпиленный в ресурсы внешней DLL


14-1087392519
MBo
2004-06-16 17:28
2004.07.11
Sha - поздравляю !


1-1088071605
Alek
2004-06-24 14:06
2004.07.11
Изменения в excel ...