Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2013, 23:03   #1
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 260
По умолчанию Принудительно уничтожить поток(TThread) с корректным высвобождением памяти

Добрый день. Есть программа многопоточной загрузки с обработкой HTML-странииц
Программа работает, но иногда попадаются файлы большого размера(10 мб, например http://www.techboard.ru/thread.php?c...d=10&page=2546) с большим количеством ссылок внутри.
загрузчик (TidHttp) загружает страницу достаточно быстро(40 сек) и гарантированно, но обработка такой страницы доходит до 30 мин и завершается корректно, однако времени ждать такую страницу нет, желательно нажать на батон и завершить такой поток, но корректно
Вопросы:
- возможно ли это в принципе? с корректным освобождением ресурсов
- если возможно, то как конкретно это сделать, желательно пример
Pcrepair вне форума Ответить с цитированием
Старый 04.06.2013, 23:46   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
var stopthread: TThread;

stopthread:=???? ; // выбираем тот поток который хотим остановить
Код:
stopthread.FreeOnTerminated:=true;
далее смотрим F1 (справку!)
Цитата:
Determines whether the thread object is automatically destroyed when the thread terminates.
Код:
stopthread.Terminate:=true;
опять лезем туда
Цитата:
Indicates whether the thread has been asked to terminate.
Indicates и ничего более
! будет работать при соблюдении условия(требования)

Цитата:
The thread's Execute method and any methods that Execute calls should check Terminated periodically and exit when it's true. The Terminate method sets the Terminated property to true.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 04.06.2013 в 23:54.
evg_m вне форума Ответить с цитированием
Старый 05.06.2013, 00:33   #3
Delphi_ProGer
Форумчанин
 
Регистрация: 30.10.2010
Сообщений: 524
По умолчанию

Другими словами - никак! =)
Тоесть, без потери памяти можно остановить поток лишь тогда, когда вы в самой процедуре потока(Execute, наприм.) напишите условие что-то на подобе такого
Код:
If Terminated then {освобождаем ресурсы, закриваем сокеты, выходим из процедуры и т.д.}
И да, при таком раскладе удобное свойство есть FreeOnTerminate, о котором расказали выше.
Delphi_ProGer вне форума Ответить с цитированием
Старый 05.06.2013, 01:49   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

еще есть поля потока и его деструктор с конструктором.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TTHread, Как перезапустить поток, без его уничтожения? Человек_Борща Общие вопросы Delphi 20 21.08.2012 09:26
Если остановился поток (TThread). Как перезапустить без потери памяти Zuzlan Общие вопросы Delphi 9 01.02.2011 13:57
Пауза/продолжить поток TThread одной кнопкой Человек_Борща Общие вопросы Delphi 3 29.10.2010 00:55
Как оповестить основной поток о каком-то событии в потоке (TThread)? TwiX Общие вопросы Delphi 2 11.02.2010 02:57
Отобразить рабочий поток (TThread) NervniiJ Общие вопросы Delphi 0 10.01.2010 17:34