Форум: "Основная";
Текущий архив: 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.065 c