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