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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2015, 19:04   #1
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию Остановка потока

Всех приветствую, я запускаю поток, в случае если он не производит свои действия я его останавливаю, в try except пишу exit
Далее таймером проверяю давно ли он произвел нужное мне действие, если да то, запускаю его снова, но перед этим хочу его остановить... ну на всякий случай
Код:
NewThread:=TNewThread.Create(false); //так я запускаю
NewThread.Free; //так хочу убить через таймер
NewThread:=TNewThread.Create(false); //так запустить снова...
Но из-за второй строчки программа начинает висеть и вылетает, я в недоумении... Прошу помощи, расскажите пожалуйста в чем дело, заранее спасибо
Вообще не понимаю почему поток завершает свою работу спустя 5-30 минут, никаких исключений быть не должно, а если и есть они обрабатываются...

Последний раз редактировалось vipok72; 01.08.2015 в 19:23.
vipok72 вне форума Ответить с цитированием
Старый 01.08.2015, 19:42   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но перед этим хочу его остановить... ну на всякий случай
Зачем??
Цитата:
из-за второй строчки программа начинает висеть и вылетает, я в недоумении...
Вообще-то Free освобождает объект. После него у тебя уже никакого потока в этой переменной быть не может.
Смотри, у тебя получается оригинальная реализация: Ты создаешь поток, стартуешь его сразу. Далее поток параллельно выполняется, и во время его выполнения ты вызываешь для него Free. Это выглядит как если бы я зашел в макдональдс, заказал бургер, а чтоб оффективнее шевелились пока готовится бургер из РПГ пульнул в повара, стоящего у плиты.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.08.2015, 20:01   #3
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Зачем??

Вообще-то Free освобождает объект. После него у тебя уже никакого потока в этой переменной быть не может.
То есть после Free я не могу более создать поток в этой переменной??
А каким образом принудительно завершить поток из вне?
Может?
Код:
NewThread.Terminate;
vipok72 вне форума Ответить с цитированием
Старый 01.08.2015, 20:50   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
То есть после Free я не могу более создать поток в этой переменной?
То есть после Free твой созданный выше поток уже не действителен. Это не смотря на то, что он во время освобождения работает. Сунь палку в колесо едущего велосипеда - что с ним произойдет? Тут то же самое. Ты забываешь, что потоки работают параллельно главной программе, и ее работу не приостанавливают.
Цитата:
А каким образом принудительно завершить поток из вне?
Ну я например в потоке описываю некое свойство типа Boolean.
Если хочу завершить пишу следующий код:
Код:
Поток.ТаПеременка:=true;
Поток.Wait;
А в самом потоке, если у меня там цикл, в цикле проверяю
Код:
if not ТаПеременка then exit;
Если же в потоке нет цикла, но есть какие-то долгоиграющие операторы типа закачки порнухи из тырнета, то можно использовать функцию TerminateThread(), что убьет поток мгновенно.

Но все зависит от того, на кой черт этакий ручной тормоз понадобился.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.08.2015, 22:49   #5
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию

У меня идет скачивание страниц одного сайта, для парсинга, по неизвестной причине, иногда поток перестает работать, но сие чудо в бесконечном цикле while который работает примерно так, как вы описали и можно подобным образом завершить его работу, бывает что поток перестает работать и мне нужно его перезапустить из вне, а не завершить поток внутри и запустить из вне, как я понял можно сделать так:
Код:
NewThread.Free; //завершаем работу потока
//тут еще раз объявить переменную NewThread
NewThread:=TNewThread.Create(false); //запускаем поток
Кстати что насчет FreeOnTerminate?
Я так понял если просто присвоить ему значение true и в случае непредвиденной ошибки с помощью exit завершить поток потом запустить его снова - будет все норм?
Цитата с одного форума:
Цитата:
Но можно в потоке установитьYuorThread.FreeOnTerminat e := True и в любом месте главного потока просто вызвать YuorThread.Terminate - поток сам удалит себя
Т.е. достаточно установить значение true, из вне вызвать Terminate, после него сразу запуск потока, будет все работать?

Последний раз редактировалось vipok72; 01.08.2015 в 23:12.
vipok72 вне форума Ответить с цитированием
Старый 01.08.2015, 23:17   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
бывает что поток перестает работать и мне нужно его перезапустить из вне
Тогда встает вопрос, что за код внутри потока? Есть ли там проверка таймаута...
Перезапуск потока можно достичь пересозданием потока. Но тогда полюбому нужно послать потоку сигнал завершения, и подождать пока он завершится.
Цитата:
Кстати что насчет FreeOnTerminate?
Я так понял если просто присвоить ему значение true и в случае непредвиденной ошибки с помощью exit завершить поток потом запустить его снова - будет все норм?
Это свойство говорит о том, что по завершению потока объект потока будет освобожден самостоятельно. Всего-то. Не будет у тебя ничего "норм", пока ты не пересмотришь стратегию скачивания. Таймауты, скачивание через сокеты или хотя бы через WinINET функции, которые позволят мониторить и скачивать блоками, а так же делать докачку в случае сбоя. Все это должно быть предусмотренно внутри. Как раз поток должен быть автономен и достаточно умен, чтоб контролировать самого себя, а не делать это извне. Так ты ничего не добъешься, поверь на слово.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить доступ к методу потока(TThread) из основного потока? Pcrepair Общие вопросы Delphi 3 30.03.2013 14:52
Должно быть 3 потока. А диспетчер задач показывает, что потока создано 2 BEL9ILLI Общие вопросы Delphi 3 06.12.2011 20:26
Как узнать номер потока из самого потока? GaMeSTeR Помощь студентам 0 03.12.2010 09:50
Немедленная остановка потока. Altera Общие вопросы Delphi 16 07.02.2009 11:17
Управление потоками. Запуск, остановка, приоритет потока. metamfetamin Помощь студентам 5 11.11.2007 12:45