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

Ваш аккаунт

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

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

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

Прервать загрузку в TJPEGImage ?

1.7K
17 октября 2005 года
AndrewSha
64 / / 13.01.2003
Собственно вопрос прозвучал. У TJPEGImage можно задать обработчик OnProgress, но там вроде нет возможности прервать процесс.
Делаю так: генерю исключение в этом обработчике, типа throw Exception("Stop loading process");
- получается, процесс прерван, НО!!! память не возвращается системе после удаления ссылки на объект TJPEGImage. И если так прервать десяток загрузок 1.5 mb файлов, памяти становится ощутимо меньше, а потом и вообще не остаётся. Загрузка происходит в отдельном потоке.
Кто-нибудь знает как побороть ???
1.7K
18 октября 2005 года
AndrewSha
64 / / 13.01.2003
А может быть кто знает компонент, кот поможет решить проблему ?
9.8K
18 октября 2005 года
bqserg
56 / / 27.09.2005
Цитата:
Originally posted by AndrewSha
А может быть кто знает компонент, кот поможет решить проблему ?



С TJPEGImage ничего не получится. OnProgress только статус процесса показывает, а не управляет им.
Если хочешь прерывать загрузку файла и чтобы еще и память очищалась, то лучше найди исходники библиотеки JPEG. Компонент скорее всего самому придется писать.;)

362
18 октября 2005 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by AndrewSha
Кто-нибудь знает как побороть ???



Может попробовать так (первое что пришло на ум):

Генеришь исключения, но какого-то своего типа, у него можно сделать поле, в котором указавать, какой компонент загружался.

В Application->OnException или при помощи комопнента TApplicationEvents отлавиливаешь это исключение, остальные пропускаешь

При отлове исключения вызывать очистку компонента Image, который значился в этом исключении. Не помню какая там функция очистки.

10
18 октября 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by _kolyan
В Application->OnException или при помощи комопнента TApplicationEvents отлавиливаешь это исключение, остальные пропускаешь


Не знаю, как в Сях, а в Дельфи (VCL?) для подобных случаев предусмотрено исключение EAbort и стандартная процедура Abort, его вызывающая. Описано это дело, помнится, в SysUtils. При пользовании EAbort дополнительного кода писать не надо - оно пропускается при обработке исключений приложением.

1.7K
19 октября 2005 года
AndrewSha
64 / / 13.01.2003
Проблема не в том чтобы сгенерить ислючение, проблема в том, что если я прерываю загрузку таким образом, то не освобождается память, захапанная компонентом TJPEGImage, даже после удаления ссылки на него.
Это можно было бы пережить, но память хавается просто огромными кусками, метров по 20.
362
19 октября 2005 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by AndrewSha
Это можно было бы пережить, но память хавается просто огромными кусками, метров по 20.



Так что там насчет очистки? FreeImage не помогает? Не помню точно имени функции, есть какая-то у этого компонента не для удаления самого компонента, а для очистки изображения.

1.7K
19 октября 2005 года
AndrewSha
64 / / 13.01.2003
Цитата:
FreeImage не помогает?


Нету у объекта TJPEGImage метода FreeImage.

10
19 октября 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by AndrewSha
Нету у объекта TJPEGImage метода FreeImage.


Тогда боюсь, придется смотреть исходники библиотеки, используемой компонентом. На диске с Билдером должны быть.

1.7K
20 октября 2005 года
AndrewSha
64 / / 13.01.2003
Посмотрю.
Альтернативных путей никто не подскажет ?
9.8K
20 октября 2005 года
bqserg
56 / / 27.09.2005
Сомневаюсь что таковые имеются, потому как кодировщик (то бишь сама библиотека сжатия JPEG), выделяет память для себя сама и освобождает естественно тоже. А когда ты вызываешь исключение ты тормозишь процесс посередине, и вообще обрываешь ход действий.

Я одним глазом глянул в библиотеку, там сразу в глаза бросились пару функций - Останова (де)компрессии и очистка занятой памяти...
Осталось только ручками поработать!:D

Тебе даже не обязательно исходник библиотки JPEG иметь, достаточно заголовочный файл "jpeg.h" (если не ошибаюсь), откомпайленую библиотеку и исходник TJPEGImage (чтобы не разбираться что за чем идет).
OnProgress переделать надо, добавить переменную Abort, чтобы можно было остановить процесс.
И переписываешь функцию компрессии TJPEGImage с учетом Abort.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог