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

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

Разбудить спящий поток [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 на ожидание сообщения... "будить" его посылкой. + не забыть при остановке потока тоже его разблокировать.


Наверх

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