Дескрипторы для TJPEGImage
Делал программку которая в автоматическом режиме подгружает изображения изменяет и сохраняет. Для работы с jpeg/jpg использовал jpeg.hpp. Чтобы не тратить время на создание и удаление объекта TJPEGImage создаю его один раз.
При работе, после обработки кортинок, общим объемом 500 МБ та часть оперативной памяти которая недоступна другим приложениям кроме моего (по Монитору ресурсов) становится равной 2 ГБ, и наконец завершение приложения.
Создание и удаление TJPEGImage внутри функции не меняет сути дела, также как и метод удаления. Поиск ответа привел, лишь, к тому, что TJPEGImage не имеет метода освобождения от дескриптора. В итоге они накапливаются и освободиться можно от них только завершив приложение.
Может кто смог решить проблему? Поделитесь опытом.
Код:
TJPEGImage:: imgbuffer = new TJPEGImage(); //созданы на всё ...
Graphics::TBitmap::bmpbuffer = new Graphics::TBitmap;// ...время выполнения
//-----------------------------
void Process(){
imgbuffer->LoadFromFile(FN1);
bmpbuffer->Assign(imgbuffer);
//...здесь что то делаем с bmpbuffer
bmpbuffer->SaveToFile(FN2);
}
Graphics::TBitmap::bmpbuffer = new Graphics::TBitmap;// ...время выполнения
//-----------------------------
void Process(){
imgbuffer->LoadFromFile(FN1);
bmpbuffer->Assign(imgbuffer);
//...здесь что то делаем с bmpbuffer
bmpbuffer->SaveToFile(FN2);
}
А дескриптор чего он не освобождает? Счетчик дескрипторов по монитору растет?
К сожалению число дескрипторов по монитору установить нельзя, факт лишь в том, что жрется оперативная память пропорционально числу вызовов метода LoadFromFile для TJPEGImage. На счет дескрипторов - открытие не мое (на какомто форуме вычитал). Но с TBitmap подобной проблемы нет!
Проверь, без bmpbuffer->Assign(imgbuffer); этой строчки будет утечка или нет.
TJPEGImage::Assign(NULL) значит пробуй.
Проверил (без bmpbuffer->Assign(imgbuffer);), тот же результ. Вообще, в Process() для TBitmap вызываю методы DefaultHandler(), FreeImage() и ReleaseHandle(), поэтому подозрение падает на TJPEGImage у которого нет таких методов.
TJPEGImage::Assign(NULL) - что именно вставить?
это и вставить. скажем перед Load
если загружать маленькую картинку, то памяти жрется меньше, но всеравно жрется.
Думаю сделать функцию, которая будет оценивать оставшуюся оперативную память, выдавать сообщение с соболезнованиями и завершать приложение!
Ну а вообще я думаю, что это из за sharedimage tjpegdata, который при assign или загрузке копируется/создается, но не удаляется.
Цитата: Meander
Думаю сделать функцию, которая будет оценивать оставшуюся оперативную память, выдавать сообщение с соболезнованиями и завершать приложение!
:facepalm:
Лучше уж отказаться от использования tjpegimage в пользу какого нибудь альтернативного обработчика жпегов.
Цитата: Meander
Проверил (без bmpbuffer->Assign(imgbuffer);), тот же результ.
Тогда ошибка не там, а в коде обработки bitmap.
Цитата:
В первую очередь попробуй просто обновить ide, возможно это баг и уже пофикшен.
Ну а вообще я думаю, что это из за sharedimage tjpegdata, который при assign или загрузке копируется/создается, но не удаляется.
Ну а вообще я думаю, что это из за sharedimage tjpegdata, который при assign или загрузке копируется/создается, но не удаляется.
Интересно, есть какое нибудь менее кардинальное решение, например небольшая и современная jpeg - библиотечка?
Цитата:
Тогда ошибка не там, а в коде обработки bitmap.
В том то и дело, что если использовать только bitmap без tjpegimage, то проблем нет.
Если использовать только tjpegimage, то жрется память.
Загрузка и сохранение bmp-файлов может продолжаться бесконечно, а jpeg - пока оперативная памать не кончится.
Intel JPEG library,не?