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

Вниз

Вопрос по работе потока (Thead)   Найти похожие ветки 

 
dreamse   (2008-07-02 12:56) [0]

Приветствую.

Подскажите как сделать бесконечный поток который бы выполнялся постоянно.

Делаю в потоке:


procedure TMyThead.Execute;
begin
 while not terminated do
  begin
   // код который должен постоянно проверяться в зависимости от события. Таймер ставить нельзя так как неизвестно когда событие появиться, нужно именно ждать его появления и реагировать в потоке
  end;
end;


Из за этого приложение начинает загружать процесор на 99 % :(

Какие есть варианты ?
Уничтожать и создавать поток каждый раз при наступления события: не выход так как событий могут быть тысячи и нужно их сразу в потоке ставить в очередь.


 
Поросенок Винни-Пух ©   (2008-07-02 13:05) [1]

вызывать функции ожидания waitforsingleobject и ей подобные


 
Германн ©   (2008-07-02 13:07) [2]


> код который должен постоянно проверяться в зависимости от
> события. Таймер ставить нельзя так как неизвестно когда
> событие появиться, нужно именно ждать его появления и реагировать
> в потоке


> Уничтожать и создавать поток каждый раз при наступления
> события: не выход так как событий могут быть тысячи и нужно
> их сразу в потоке ставить в очередь.

Странное совмещение синхронной и асинхронной логики работы. Изврат.


 
Сергей М. ©   (2008-07-02 13:08) [3]


> Из за этого приложение начинает загружать процесор на 99
> %


Добавь в  тело цикла sleep(0) и удивись


> неизвестно когда событие появиться


Так уж и неизвестно ?

Сомневаюсь)


 
tesseract ©   (2008-07-02 13:15) [4]


> код который должен постоянно проверяться в зависимости от
> события.


А асинхронную процедуру или callback нельзя для обработки использовать ?


 
dreamse   (2008-07-02 13:23) [5]

Спасибо. sleep помог


 
Сергей М. ©   (2008-07-02 13:24) [6]


> sleep помог


Это называется "латание драных лаптей", а не решение)


 
int64   (2008-07-02 19:09) [7]

dreamse   (02.07.08 12:56)  

Потоком надо не мониторить событие, а обрабатывать.


 
Loginov Dmitry ©   (2008-07-03 08:07) [8]

> Спасибо. sleep помог


Использование Sleep() для задержки потока часто усложняет логику программы и увеличивает время реакции. С нулем также известны проблемы: если в системе, по мнению Windows, больше некому отдать квант времени, то управление немедленно вернется к твоей программе, и опять будешь грузить процессор. Используй хотябы Sleep(20), и таких проблем не будет. Твоей программе скорее всего будет все равно: 0мс или 20мс.

Целесообразно управлять потоком с помощью Эвента. Тогда Execute примет такой вид:

begin
 while (not Terminated) and (WaitForSingleObject(FEvent, 20) = WAIT_TIMEOUT) do
 begin

 end;
end;


Логика стала проще. Время реакции на завершение - меньше. Для выхода из Execute теперь достаточно вызвать SetEvent(FEvent);


 
tesseract ©   (2008-07-03 19:37) [9]


>  Для выхода из Execute теперь достаточно вызвать SetEvent(FEvent);


Ага, это приусловии, что код не выполняеться по полдня. Waitfor чем не люб для ожидания terminated = true ?


 
Loginov Dmitry ©   (2008-07-03 20:01) [10]

> Waitfor чем не люб


Тогда так:
SetEvent(FEvent);
TThread.Waitfor;


или


SetEvent(FEvent);
TThread.Free;


Главное, что SetEvent(FEvent) позволяет уменьшить время реакции.


 
GrayFace ©   (2008-07-05 00:27) [11]

dreamse   (02.07.08 12:56)
Уничтожать и создавать поток каждый раз при наступления события: не выход так как событий могут быть тысячи и нужно их сразу в потоке ставить в очередь.

Скорее всего, нужно окно+посылка сообщений ему. И уж точно никаких Sleep"ов - по-моему, они нужны только в случаях маленьких объектов, которым давать по объекту ядра слишком "жирно". Ну в некоторых очень специфических случаях.


 
GrayFace ©   (2008-07-05 00:28) [12]

*Ну и в некоторых очень специфических случаях.



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

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

Наверх




Память: 0.49 MB
Время: 0.013 c
15-1247603405
Юрий
2009-07-15 00:30
2009.09.13
С днем рождения ! 15 июля 2009 среда


1-1214989005
dreamse
2008-07-02 12:56
2009.09.13
Вопрос по работе потока (Thead)


15-1247744394
картман
2009-07-16 15:39
2009.09.13
Книги по моделированию данных.


15-1248031803
Юрий
2009-07-19 23:30
2009.09.13
С днем рождения ! 18 июля 2009 суббота


2-1247038910
petr
2009-07-08 11:41
2009.09.13
Запись в реестр