Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Дескрипторы для TJPEGImage

446
23 декабря 2011 года
Meander
487 / / 04.09.2011
Всех с Наступающим!

Делал программку которая в автоматическом режиме подгружает изображения изменяет и сохраняет. Для работы с 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);
}
14
23 декабря 2011 года
Phodopus
3.3K / / 19.06.2008
А дескриптор чего он не освобождает? Счетчик дескрипторов по монитору растет?
446
23 декабря 2011 года
Meander
487 / / 04.09.2011
К сожалению число дескрипторов по монитору установить нельзя, факт лишь в том, что жрется оперативная память пропорционально числу вызовов метода LoadFromFile для TJPEGImage. На счет дескрипторов - открытие не мое (на какомто форуме вычитал). Но с TBitmap подобной проблемы нет!
277
23 декабря 2011 года
arrjj
1.7K / / 26.01.2011
Проверь, без bmpbuffer->Assign(imgbuffer); этой строчки будет утечка или нет.
14
23 декабря 2011 года
Phodopus
3.3K / / 19.06.2008
По монитору или таск менеджеру - можно.
TJPEGImage::Assign(NULL) значит пробуй.
446
23 декабря 2011 года
Meander
487 / / 04.09.2011
Проверил (без bmpbuffer->Assign(imgbuffer);), тот же результ. Вообще, в Process() для TBitmap вызываю методы DefaultHandler(), FreeImage() и ReleaseHandle(), поэтому подозрение падает на TJPEGImage у которого нет таких методов.
446
23 декабря 2011 года
Meander
487 / / 04.09.2011
TJPEGImage::Assign(NULL) - что именно вставить?
14
23 декабря 2011 года
Phodopus
3.3K / / 19.06.2008
это и вставить. скажем перед Load
446
23 декабря 2011 года
Meander
487 / / 04.09.2011
...незнаю у меня нельзя (не получается) загрузить НУЛЬ если писать TJPEGImage::Assign(NULL) или (imgbuffer->Assign(NULL))
если загружать маленькую картинку, то памяти жрется меньше, но всеравно жрется.
Думаю сделать функцию, которая будет оценивать оставшуюся оперативную память, выдавать сообщение с соболезнованиями и завершать приложение!
277
23 декабря 2011 года
arrjj
1.7K / / 26.01.2011
В первую очередь попробуй просто обновить ide, возможно это баг и уже пофикшен.

Ну а вообще я думаю, что это из за sharedimage tjpegdata, который при assign или загрузке копируется/создается, но не удаляется.
277
24 декабря 2011 года
arrjj
1.7K / / 26.01.2011
Цитата: Meander
Думаю сделать функцию, которая будет оценивать оставшуюся оперативную память, выдавать сообщение с соболезнованиями и завершать приложение!



:facepalm:
Лучше уж отказаться от использования tjpegimage в пользу какого нибудь альтернативного обработчика жпегов.

10
24 декабря 2011 года
Freeman
3.2K / / 06.03.2004
Цитата: Meander
Проверил (без bmpbuffer->Assign(imgbuffer);), тот же результ.


Тогда ошибка не там, а в коде обработки bitmap.

446
24 декабря 2011 года
Meander
487 / / 04.09.2011
Цитата:
В первую очередь попробуй просто обновить ide, возможно это баг и уже пофикшен.

Ну а вообще я думаю, что это из за sharedimage tjpegdata, который при assign или загрузке копируется/создается, но не удаляется.



Интересно, есть какое нибудь менее кардинальное решение, например небольшая и современная jpeg - библиотечка?

446
24 декабря 2011 года
Meander
487 / / 04.09.2011
Цитата:
Тогда ошибка не там, а в коде обработки bitmap.



В том то и дело, что если использовать только bitmap без tjpegimage, то проблем нет.
Если использовать только tjpegimage, то жрется память.
Загрузка и сохранение bmp-файлов может продолжаться бесконечно, а jpeg - пока оперативная памать не кончится.

7
24 декабря 2011 года
@pixo $oft
3.4K / / 20.09.2006
Intel JPEG library,не?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог