Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно "убить" зависший Thread


Страницы:   1 2

Alex_C ©   (2015-07-29 08:36:00) 

Столкнулся с такой проблемой: есть тред, получающий эпизодически достаточно большую порцию данных из инета, обрабатывающий ее и выводящий в окно основной программы. Если у пользователя стоит использование спящего режима, когда комп переходит в спящий режим тред зависает при получении данных (я так понимаю, что это происходит если комп перешел в спящий момент когда как раз велся прием данных).
При попытке выхода из программы пытаюсь завершить тред:
Terminate;
WaitFor - тут просто программа виснет, ожидая окончания работы треда.
Вопрос: как правильно сделать WaitFor но с указанием, сколько времени ждать окончания завершения заботы программы, а уж потом ее
TerminateThread(MyThread.Handle);?


Игорь Шевченко   (2015-07-29 15:36:00) [21]


> как правильно сделать WaitFor но с указанием, сколько времени
> ждать окончания завершения заботы программы, а уж потом
> ее
> TerminateThread(MyThread.Handle);?


А зачем ждать, если можно сразу убить ?


кгшзх   (2015-07-29 15:17:00) [22]

Terminate не завершает поток,

Так он не Terminate и вызывает

TerminateThread is used to cause a thread to exit.
When this occurs, the target thread has no chance to execute any user-mode code.


кгшзх   (2015-07-29 15:00:00) [23]

Как ты предлагаешь завершать вторичные потоки при завершении приложения?


Повторяю по слогам:
Зачем создавать вторичный, если из главного ему собираются делать WaitFor?

Про зависание/отвисание/терминэйт вообще пока речи не идет.
Речь про любойвторичный поток

Как ты предлагаешь завершать вторичные потоки при завершении приложения?

Они тупо должны ловить окончание процесса, завершение винды, етц.
Как это делает главный поток.
Ну и естественно вторичный надо оповещать о них самому.


DVM   (2015-07-29 14:30:00) [24]


> кгшзх ©   (29.07.15 13:06) [1]


> Встречный вопрос: зачем тебе вторичный поток, если ты собрался
> делать ему WaitFor?

Как ты предлагаешь завершать вторичные потоки при завершении приложения?


Юрий Зотов   (2015-07-29 14:22:00) [25]

> Alex_C   (29.07.15 08:36)

Terminate не завершает поток, а только выставляет его свойство Terminated. Чтобы поток завершился, в его методе Execute надо проверять это свойство и если оно true, то выходить из Execute. Если этого не делать, то Execute не завершается, поток тоже - и WaitFor будет ждать бесконечно.


кгшзх   (2015-07-29 13:09:00) [26]

второй встречный вопрос:
зачем с надеждой в глазах ждать засуспенженый сред пять минут, чтобы не дождавшись его сделать ему кил?

не пробовал ресьюмить его?


кгшзх   (2015-07-29 13:06:00) [27]

Вопрос: как правильно сделать WaitFor

Встречный вопрос: зачем тебе вторичный поток, если ты собрался делать ему WaitFor?
это все равно что весь код вторичного потока выполнить в главном.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо