Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Разбудить спящий поток   Найти похожие ветки 

 
Дмитрий Белькевич   (2011-04-07 09:32) [0]

Нужно иногда перезапускать поток. Т.е. делать ему terminate, дождаться, пока он закончит работу, прибить его и создать заново. Поток "висит" в sleep. Sleep может продолжаться достаточно долго, например, час. Каждую секунду пробуждать поток - смотреть, а не случился terminate не хочется - расход ресурсов. Можно ли чем-то вывести поток из sleep"а (кроме terminatethread, само собой)? Может вообще отказаться от sleep"а? На что лучше sleep поменять? Спасибо.


 
sniknik ©   (2011-04-07 09:34) [1]

заменить sleep на ожидание сообщения... "будить" его посылкой. + не забыть при остановке потока тоже его разблокировать.


 
CrytoGen   (2011-04-07 09:35) [2]

Event может выполнять функцию sleep и прерываться так сказать по требованию.


 
~AQUARIUS~   (2011-04-07 09:36) [3]

http://www.transl-gunsmoker.ru/2010/05/blog-post.html


 
Дмитрий Белькевич   (2011-04-07 09:52) [4]

Спасибо, в гугле нашлось:

http://objectmix.com/delphi/402360-tthread-sleep-terminate.html

У меня, правда, ситуация несколько другая, но пойдет.


 
Сергей М. ©   (2011-04-07 10:30) [5]

А SleepEx не спасет ОРД ?


 
oxffff ©   (2011-04-07 11:36) [6]


> Сергей М. ©   (07.04.11 10:30) [5]
> А SleepEx не спасет ОРД ?


+1


 
_Юрий   (2011-04-07 18:56) [7]


> заменить sleep на ожидание сообщения...


+1


 
Palladin ©   (2011-04-08 22:10) [8]

> вэсна, дэвушки...

+1


 
Dimka Maslov ©   (2011-04-09 12:03) [9]

Для подобных целей существуют функции WaitForSingleObject и WaitForMultipleObject, которые могут и затормозить поток (в т.ч на определённое время), так и продолжить его работу по наступлении некоторого события. Останавливать поток через Sleep - варварство.


 
Leonid Troyanovsky ©   (2011-04-09 16:54) [10]


> Дмитрий Белькевич   (07.04.11 09:32)  

> terminatethread, само собой)?

После TT приложение обязано терминироваться.

--
Regards, LVT.


 
oxffff ©   (2011-04-10 12:55) [11]


> Останавливать поток через Sleep - варварство.


То есть эту функцию придумал варвар.


 
Dimka Maslov ©   (2011-04-11 18:14) [12]


> То есть эту функцию придумал варвар.

он самый


 
Юрий Зотов ©   (2011-04-11 18:15) [13]

1. Вместо Sleep написать Suspend (поток усыпляет сам себя).
2. Будить из другого потока вызовом Terminate и Resume.


 
Slym ©   (2011-04-12 04:47) [14]

в потоке

procedure Thread.Wakeup;
begin
 PulseEvent(hEvent);
end;

while not Terminated do
begin
 WaitForSingleObject(hEvent,INFINITE);
 if Terminated then break;
 //работаем
end;

в  другом потоке
Thread.Wakeup;


 
_oxffff   (2011-04-12 12:16) [15]

Alertable state and QueueUserApc это наше все.


 
han_malign   (2011-04-13 09:05) [16]


> 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;


 
han_malign   (2011-04-13 10:01) [17]

а правильнее будет:
procedure Thread.Wakeup;
begin
 ReleaseSemaphore(F_rghevIdle[0], 1, nil);
end;


 
Капитан очевидность   (2011-04-16 23:30) [18]


> 1. Вместо Sleep написать Suspend (поток усыпляет сам себя).


Нужно периодически просыпаться, то есть нужен Suspend на время.

Сделал почти как:

http://objectmix.com/delphi/402360-tthread-sleep-terminate.html

нормально работает.


 
Дмитрий Белькевич   (2011-04-16 23:32) [19]

Что-то меня форум решил ником наградить :)



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.06 c
4-1262850914
Dy1
2010-01-07 10:55
2013.03.22
получение html-страницы post-запросом


2-1332225008
ixen
2012-03-20 10:30
2013.03.22
Обращение из потока


2-1334680433
Afrost
2012-04-17 20:33
2013.03.22
строки текстового файла преобразовать в массив


2-1336118119
igorium
2012-05-04 11:55
2013.03.22
Как открыть папку в проводнике (вид - эскиз)


2-1333737680
SiDimka
2012-04-06 22:41
2013.03.22
Вызов прцедуры из bpl