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

Вниз

Вопрос по работе потока (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.005 c
2-1247176562
Zonder2008
2009-07-10 01:56
2009.09.13
Найти вхождение подстроки через определенное количество символов


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


8-1196969315
uitl
2007-12-06 22:28
2009.09.13
bmp


2-1247575543
b/@.
2009-07-14 16:45
2009.09.13
Как рисовать на форме поверх всего ?


15-1247583182
Пит
2009-07-14 18:53
2009.09.13
Покупка Adobe Photoshop





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский