![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разбудить спящий поток [WinXP]
Дмитрий Белькевич © (2011-04-07 09:32:00)Нужно иногда перезапускать поток. Т.е. делать ему terminate, дождаться, пока он закончит работу, прибить его и создать заново. Поток 'висит' в sleep. Sleep может продолжаться достаточно долго, например, час. Каждую секунду пробуждать поток - смотреть, а не случился terminate не хочется - расход ресурсов. Можно ли чем-то вывести поток из sleep'а (кроме terminatethread, само собой)? Может вообще отказаться от sleep'а? На что лучше sleep поменять? Спасибо.
Дмитрий Белькевич (2011-04-16 23:32:00) [1]Что-то меня форум решил ником наградить :)
Капитан очевидность (2011-04-16 23:30:00) [2]
> 1. Вместо Sleep написать Suspend (поток усыпляет сам себя).
Нужно периодически просыпаться, то есть нужен Suspend на время.
Сделал почти как:
http://objectmix.com/delphi/402360-tthread-sleep-terminate.html
нормально работает.
han_malign (2011-04-13 10:01:00) [3]а правильнее будет:
procedure Thread.Wakeup;
begin
ReleaseSemaphore(F_rghevIdle[0], 1, nil);
end;
han_malign (2011-04-13 09:05:00) [4]
> 1. Вместо Sleep написать Suspend (поток усыпляет сам себя).
> 2. Будить из другого потока вызовом Terminate и Resume.
- угу, и не забывать в конце "шага" синхронизировать внешний поток, либо контролировать Suspended(хотя не поможет - гонка остается - таки синхронизировать, причем нетривиально)...
Как в том анекдоте - "Хотим по настоящему ..."...
> while not Terminated do
> begin
> WaitForSingleObject(hEvent,INFINITE);
> if Terminated then break;
procedure Thread.Wakeup;
begin
SetEvent(F_rghevIdle[0]);
end;
procedure Thread.Terminate;
begin
SetEvent(F_rghevIdle[1]);
end;
while( WaitForMultipleObjects(2, PWOHandleArray(@F_rghevIdle), false, INFINITE) = WAIT_OBJECT_0 )do begin
...
end;
_oxffff (2011-04-12 12:16:00) [5]Alertable state and QueueUserApc это наше все.
Slym (2011-04-12 04:47:00) [6]в потоке
procedure Thread.Wakeup;
begin
PulseEvent(hEvent);
end;
while not Terminated do
begin
WaitForSingleObject(hEvent,INFINITE);
if Terminated then break;
//работаем
end;
в другом потоке
Thread.Wakeup;
Юрий Зотов (2011-04-11 18:15:00) [7]1. Вместо Sleep написать Suspend (поток усыпляет сам себя).
2. Будить из другого потока вызовом Terminate и Resume.
Dimka Maslov (2011-04-11 18:14:00) [8]
> То есть эту функцию придумал варвар.
он самый
oxffff (2011-04-10 12:55:00) [9]
> Останавливать поток через Sleep - варварство.
То есть эту функцию придумал варвар.
Leonid Troyanovsky (2011-04-09 16:54:00) [10]
> Дмитрий Белькевич (07.04.11 09:32)
> terminatethread, само собой)?
После TT приложение обязано терминироваться.
--
Regards, LVT.
Dimka Maslov (2011-04-09 12:03:00) [11]Для подобных целей существуют функции WaitForSingleObject и WaitForMultipleObject, которые могут и затормозить поток (в т.ч на определённое время), так и продолжить его работу по наступлении некоторого события. Останавливать поток через Sleep - варварство.
Palladin (2011-04-08 22:10:00) [12]> вэсна, дэвушки...
+1
_Юрий (2011-04-07 18:56:00) [13]
> заменить sleep на ожидание сообщения...
+1
oxffff (2011-04-07 11:36:00) [14]
> Сергей М. © (07.04.11 10:30) [5]
> А SleepEx не спасет ОРД ?
+1
Сергей М. (2011-04-07 10:30:00) [15]А Sleep Exне спасет ОРД ?
Дмитрий Белькевич (2011-04-07 09:52:00) [16]Спасибо, в гугле нашлось:
http://objectmix.com/delphi/402360-tthread-sleep-terminate.html
У меня, правда, ситуация несколько другая, но пойдет.
~AQUARIUS~ (2011-04-07 09:36:00) [17]http://www.transl-gunsmoker.ru/2010/05/blog-post.html
CrytoGen (2011-04-07 09:35:00) [18]Event может выполнять функцию sleep и прерываться так сказать по требованию.
sniknik (2011-04-07 09:34:00) [19]заменить sleep на ожидание сообщения... "будить" его посылкой. + не забыть при остановке потока тоже его разблокировать.