Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.49 MB
Время: 0.052 c
15-1343378205
Phoenix_
2012-07-27 12:36
2013.03.22
Delphi -> Java/Android


15-1338582165
Глеб
2012-06-02 00:22
2013.03.22
Форматирование в дельфи


15-1338563526
Медвежонок Пятачок
2012-06-01 19:12
2013.03.22
Сменить глобус проживания


15-1353950365
Разведка
2012-11-26 21:19
2013.03.22
Проблема принтера для чеков VKP-80-II


2-1338195526
Вовка
2012-05-28 12:58
2013.03.22
Сохранение файла gif




   Наверх