Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
Дмитрий Белькевич   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.066 c
15-1343831888
Begin_END_Begin
2012-08-01 18:38
2013.03.22
Что-то со Скайпом...


15-1350915204
Дмитрий С
2012-10-22 18:13
2013.03.22
exe с номером билда


15-1345798515
Beginer
2012-08-24 12:55
2013.03.22
Как отключить автовыравнивание значков на рабочем столе?


15-1344601216
Павел
2012-08-10 16:20
2013.03.22
установка


15-1340695025
alexdn
2012-06-26 11:17
2013.03.22
TurboPower OnGuard





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский