Конференция "Основная" » Вопрос по работе потока (Thead) [D7, WinXP]
 
  • dreamse (02.07.08 12:56) [0]
    Приветствую.

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

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


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



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

    Какие есть варианты ?
    Уничтожать и создавать поток каждый раз при наступления события: не выход так как событий могут быть тысячи и нужно их сразу в потоке ставить в очередь.
  • Поросенок Винни-Пух © (02.07.08 13:05) [1]
    вызывать функции ожидания waitforsingleobject и ей подобные
  • Германн © (02.07.08 13:07) [2]

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


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

    Странное совмещение синхронной и асинхронной логики работы. Изврат.
  • Сергей М. © (02.07.08 13:08) [3]

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


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


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


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

    Сомневаюсь)
  • tesseract © (02.07.08 13:15) [4]

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


    А асинхронную процедуру или callback нельзя для обработки использовать ?
  • dreamse (02.07.08 13:23) [5]
    Спасибо. sleep помог
  • Сергей М. © (02.07.08 13:24) [6]

    > sleep помог


    Это называется "латание драных лаптей", а не решение)
  • int64 (02.07.08 19:09) [7]
    dreamse   (02.07.08 12:56)  

    Потоком надо не мониторить событие, а обрабатывать.
  • Loginov Dmitry © (03.07.08 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 © (03.07.08 19:37) [9]

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


    Ага, это приусловии, что код не выполняеться по полдня. Waitfor чем не люб для ожидания terminated = true ?
  • Loginov Dmitry © (03.07.08 20:01) [10]
    > Waitfor чем не люб


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



    или


    SetEvent(FEvent);
    TThread.Free;



    Главное, что SetEvent(FEvent) позволяет уменьшить время реакции.
  • GrayFace © (05.07.08 00:27) [11]
    dreamse   (02.07.08 12:56)
    Уничтожать и создавать поток каждый раз при наступления события: не выход так как событий могут быть тысячи и нужно их сразу в потоке ставить в очередь.

    Скорее всего, нужно окно+посылка сообщений ему. И уж точно никаких Sleep'ов - по-моему, они нужны только в случаях маленьких объектов, которым давать по объекту ядра слишком "жирно". Ну в некоторых очень специфических случаях.
  • GrayFace © (05.07.08 00:28) [12]
    *Ну и в некоторых очень специфических случаях.
 
Конференция "Основная" » Вопрос по работе потока (Thead) [D7, WinXP]
Есть новые Нет новых   [134491   +13][b:0][p:0.002]