Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Принудительно уничтожить поток(TThread) с корректн, Принудительно уничтожить поток(TThread)  
:(
    Опции темы
Pcrepair
Дата 4.6.2013, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



Добрый день. Есть программа многопоточной загрузки с обработкой HTML-странииц
Программа работает, но иногда попадаются файлы большого размера(10 мб, например http://www.techboard.ru/thread.php?cid=6&a...&page=2546) с большим количеством ссылок внутри.
загрузчик (TidHttp) загружает страницу достаточно быстро(40 сек) и гарантированно, но обработка такой страницы доходит до 30 мин и завершается корректно, однако времени ждать такую страницу нет, желательно нажать на батон и завершить такой поток, но корректно
Вопросы:
- возможно ли это в принципе? с корректным освобождением ресурсов
- если возможно, то как конкретно это сделать, желательно пример
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
Poseidon
Дата 4.6.2013, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Вот просмотри пример. Там показан один из вариантов как можно "попросить" поток остановится нажатием кнопки.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
boobie
Дата 6.6.2013, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 16.9.2011

Репутация: нет
Всего: нет



Код

твой_поток.suspend;//приостановить выполнение. В новых версиях Дельфи не рекомендуется
твой_поток.suspended:=true;//приостановить поток. Рекомендуется использовать вместо suspend
твой_поток.terminate;//завершить выполнение потока. Если не ошибаюсь, происходит мягкое завершение - не сразу, дожидается логического завершения.

Корректное освобождение ресурсов, я думаю, это проблема уже программиста.
PM   Вверх
Poseidon
Дата 6.6.2013, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(boobie @  6.6.2013,  07:12 Найти цитируемый пост)
твой_поток.terminate;//завершить выполнение потока. Если не ошибаюсь, происходит мягкое завершение - не сразу, дожидается логического завершения.
terminate всего-лишь устанавливает свойство Terminated в True. Само по себе поток не останавливает. Программист должен сам в теле потока позаботится о проверке свойства Terminated и завершить поток.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
bems
Дата 7.6.2013, 02:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



для начала, я думаю, нужно сделать что-то с получасовым парсингом


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Akella
Дата 7.6.2013, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 8
Всего: 329



PM MAIL   Вверх
MetalFan
Дата 18.6.2013, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Akella, имхо, чтобы ТС не путался в терминологии и уложил кашу по потокам в голове в порядок, надо в первую очередь изучить мегаопус Многопоточность - как это делается в Дельфи.

Это сообщение отредактировал(а) MetalFan - 18.6.2013, 10:14


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Akella
Дата 18.6.2013, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 8
Всего: 329



Да, долго его придётся изучать.
Но там нет одной важной фишки: в потоках лучше не использовать sleep(), а что вместо этого использовать?
PM MAIL   Вверх
MetalFan
Дата 18.6.2013, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Akella, почему? хотя какой смотря таймаут использовать... если sleep(1)/SleepEx(1, true) к примеру, то, имхо, ничего страшного... но лучше, конечно, использовать Wait-функции для ожидания внутри потока.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Poseidon
Дата 18.6.2013, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(Akella @ 18.6.2013,  13:29)
в потоках лучше не использовать sleep(), а что вместо этого использовать?

Я чего-то может недопонимаю, но расскажите мне ситуацию, в которой нужно использовать sleep в потоках


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
MetalFan
Дата 18.6.2013, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Poseidon, ну, к примеру, крутится поток в бесконченом цикле, ждет чего-то... чтобы проц не грузил, втыкаем sleep с небольшим таймаутом. 
Но это явно показывает, что есть недочеты в алгоритме работы потока.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Akella
Дата 18.6.2013, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 8
Всего: 329



Представим, что программа раз в 45 минут выполняет некую операцию, например, сохранение данных в XML. Сама операция (процедура экспорта в XML) длиться 30 секунд.
Как корректно завершить нить, чтобы правильно освободились все ресурсы, объекты и т.д.?
Если вызвать terminated у потока, то поток будет ждать пока закончится sleep только потом завершиться.
Пользователь решил завершить работу программы. Нажал Выход.... и всё - программа зависла. Пользователю что, ждать пол часа пока отработает оставшееся время, указанное в sleep?
Да, можно закрыть принудительно, но будет ли это правильно?


Добавлено @ 16:28
Я переделал на EVENT и теперь всё чики-пики smile

Добавлено @ 16:29
А если использовать sleep(45 минут), то нить тупо зависает на это время. Как ты дашь знать потоку что нужно завершиться ,если поток сейчас в глубоком sleep`е?
PM MAIL   Вверх
bems
Дата 18.6.2013, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(Akella @  18.6.2013,  16:27 Найти цитируемый пост)
А если использовать sleep(45 минут), то нить тупо зависает на это время. Как ты дашь знать потоку что нужно завершиться ,если поток сейчас в глубоком sleep`е? 
ну тогда SleepEx



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Poseidon
Дата 18.6.2013, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(MetalFan @ 18.6.2013,  15:12)
Poseidon, ну, к примеру, крутится поток в бесконченом цикле, ждет чего-то... чтобы проц не грузил, втыкаем sleep с небольшим таймаутом. 
Но это явно показывает, что есть недочеты в алгоритме работы потока.

Верно, это ошибка алгоритма работы. Но это не говорит о том, что все, хана, без sleep никак. Зачем крутить цикл в холостую? Правильнее будет запускать поток при возникновении "чего-то". Я вообще не понимаю использование sleep в программах. Единственное место где это более-менее оправдано, это работа с сетью. Но слипы более секунды тоже говорят об ошибках алгоритма. 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
MetalFan
Дата 19.6.2013, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Цитата(Poseidon @  18.6.2013,  22:46 Найти цитируемый пост)
Но слипы более секунды тоже говорят об ошибках алгоритма.

полностью согласен.

Цитата(Akella @  18.6.2013,  16:27 Найти цитируемый пост)
Я переделал на EVENT

Вот и правильное решение. Event (а можно и его обертку SyncObjs.TEvent), можно и нужно использовать в качестве "флага" того, что потоку надо что-то сделать.
А вместо sleep/suspend/resume/suspended юзать WaitForSingleObjectEx/TEvent.WaitFor SetEvent/ResetEvent

И получится и потокобезопасно и архитектурно-правильное решение.


Это сообщение отредактировал(а) MetalFan - 19.6.2013, 08:30


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0587 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.