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