грузит ли waitforsingleobject процессор?

Тема в разделе "WASM.BEGINNERS", создана пользователем arrrg, 11 ноя 2009.

  1. arrrg

    arrrg New Member

    Публикаций:
    0
    грузит ли waitforsingleobject процессор? если да,то можно ли без помощи этой функции проверить состояние эвента?
    waitforsingleobject вызывается со вторым параметром,равным нулю.хендл валидный,функция выполняется без ошибок
    з.ы. имеется блок,в котором есть МНОГО таких вызовов,когда доходит дело до него то нарушается работа всего потока + дико увеличивается загрузка процессора на достаточно неплохом комьютере
     
  2. spa

    spa Active Member

    Публикаций:
    0
    arrrg
    фактически не грузит, что собственно понятно если хоть чуть чуть понимать механизм работы данной функции и потоков в общем.

    Дальше нече не понял, кода нету я конечно экстрасенс, но мне нужна фотография.
     
  3. arrrg

    arrrg New Member

    Публикаций:
    0
    в смысле,что у меня проверяется поочереди много эвентов(206 штук,если быть точным),и в цикле.когда начинается их проверка,дико загружается проц,что вызывает вопрос - грузит ли waitforsingleobject процессор
    вот что нагуглил
    Код (Text):
    1. Мои мысли такие, что виндосв после продолжения потока (после паузы) временно даёт ему больший приоритет.
    действительно ли так?имеется ввиду пауза внутри waitforsingleobject
     
  4. arrrg

    arrrg New Member

    Публикаций:
    0
    кодес
    Код (Text):
    1. .if COUNTER<6
    2.     mov esi,COUNTER
    3.     invoke GetOFFSET,type CL_ShortString_VAR,esi,addr CTnumbuff
    4.     mov esi,CTnumbuff
    5.     lea ebx,Connectionn.V_SSTRING[0]
    6.     invoke WaitForSingleObject,(CL_ShortString_VAR ptr [esi+ebx]).updateEVENT,0
    7.     .if eax==WAIT_TIMEOUT
    8.     .else
    9.     mov esi,CTnumbuff
    10.     lea ebx,Connectionn.V_LSTRING[0]
    11.     invoke CL_UPDATE_BY_KEY,addr ((CL_ShortString_VAR ptr [esi+ebx]).key)
    12.     mov esi,CTnumbuff
    13.     lea ebx,Connectionn.V_SSTRING[0]
    14.     invoke ResetEvent,(CL_ShortString_VAR ptr [esi+ebx]).updateEVENT
    15.     inc COUNTER
    16.     jmp clthrsl1
    17.     .endif
    18.     .endif
    19.        
    20.     .if COUNTER<3
    21.     mov esi,COUNTER
    22.     invoke GetOFFSET,type CL_ShortString_VAR,esi,addr CTnumbuff
    23.     mov esi,CTnumbuff
    24.     lea ebx,Connectionn.V_LSTRING[0]
    25.     invoke WaitForSingleObject,(CL_LongString_VAR ptr [esi+ebx]).updateEVENT,0
    26.     .if eax==WAIT_TIMEOUT
    27.     .else
    28.     mov esi,CTnumbuff
    29.     lea ebx,Connectionn.V_LSTRING[0]
    30.     invoke CL_UPDATE_BY_KEY,addr ((CL_LongString_VAR ptr [esi+ebx]).key)
    31.     mov esi,CTnumbuff
    32.     lea ebx,Connectionn.V_LSTRING[0]
    33.     invoke ResetEvent,(CL_LongString_VAR ptr [esi+ebx]).updateEVENT
    34.     inc COUNTER
    35.     jmp clthrsl1
    36.     .endif
    37.     .endif
    38.        
    39.     .if COUNTER<101
    40.     mov esi,COUNTER
    41.     invoke GetOFFSET,type CL_INT_VAR,esi,addr CTnumbuff
    42.     mov esi,CTnumbuff
    43.     lea ebx,Connectionn.V_INT[0]
    44.     invoke WaitForSingleObject,(CL_INT_VAR ptr [esi+ebx]).updateEVENT,0
    45.     .if eax==WAIT_TIMEOUT
    46.     .else
    47.     mov esi,CTnumbuff
    48.     lea ebx,Connectionn.V_INT[0]
    49.     invoke CL_UPDATE_BY_KEY,addr ((CL_INT_VAR ptr [esi+ebx]).key)
    50.     mov esi,CTnumbuff
    51.     lea ebx,Connectionn.V_INT[0]
    52.     invoke ResetEvent,(CL_INT_VAR ptr [esi+ebx]).updateEVENT
    53.     inc COUNTER
    54.     jmp clthrsl1
    55.     .endif
    56.     .endif
    57.  
    58.     .if COUNTER<101
    59.     mov esi,COUNTER
    60.     invoke GetOFFSET,type CL_DOUBLE_VAR,esi,addr CTnumbuff
    61.     mov esi,CTnumbuff
    62.     lea ebx,Connectionn.V_DOUBLE[0]
    63.     invoke WaitForSingleObject,(CL_DOUBLE_VAR ptr [esi+ebx]).updateEVENT,0
    64.     .if eax==WAIT_TIMEOUT
    65.     .else
    66.     mov esi,CTnumbuff
    67.     lea ebx,Connectionn.V_DOUBLE[0]
    68.     invoke CL_UPDATE_BY_KEY,addr ((CL_DOUBLE_VAR ptr [esi+ebx]).key)
    69.     mov esi,CTnumbuff
    70.     lea ebx,Connectionn.V_DOUBLE[0]
    71.     invoke ResetEvent,(CL_DOUBLE_VAR ptr [esi+ebx]).updateEVENT
    72.     inc COUNTER
    73.     jmp clthrsl1
    74.     .endif
    75.     .endif
    76.     .if COUNTER<101
    77.     inc COUNTER
    78.     jmp clthrsl1
    79.     .endif
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Конечно будет нагрузка, так как: If dwMilliseconds is zero, the function does not enter a wait state if the object is not signaled; it always returns immediately.
    Пользуем WaitForMultipleObjects и не знаем проблем.
     
  6. arrrg

    arrrg New Member

    Публикаций:
    0
    спасибо,сейчас попробую
     
  7. arrrg

    arrrg New Member

    Публикаций:
    0
    стоп...мне нужно использовать WaitForMultipleObjects сразу для всех эвентов или поочереди для каждого и в поле count указать 1?
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Для всех. Она для такого случая и предусмотрена.
     
  9. arrrg

    arrrg New Member

    Публикаций:
    0
    эм....ну во первых,войди в аську)а во вторых,в том то и фокус,что нужно эвенты проверять отдельно друг от друга
     
  10. arrrg

    arrrg New Member

    Публикаций:
    0
    т.е. попросту сигналить о необходимости произвести какоелибо действие
     
  11. spa

    spa Active Member

    Публикаций:
    0
    arrrg
    ты хоть тогда время ожидание != 0 поставь чтоле. Код смотрел мельокм, ибо не люблю асм :derisive:
     
  12. arrrg

    arrrg New Member

    Публикаций:
    0
    нолик итак стоит
     
  13. arrrg

    arrrg New Member

    Публикаций:
    0
    упс,нето написал)я пробовал и 0 ставить,и !=0,результат одинаковый - 50% загрузка проца
     
  14. qqwe

    qqwe New Member

    Публикаций:
    0
    все вэйтилки по событиям суспендят поток (переключают на следующий в планировщике) и возвращают ему управление только после того, как установится запрошеное событие и дойдет до него очередь в планировщике. а таймаут, считайте, просто еще одно событие для оживления потока
     
  15. qqwe

    qqwe New Member

    Публикаций:
    0
    те загруженость проца у вас не от вэйтилок. ищите зацикливания в другом месте
     
  16. spa

    spa Active Member

    Публикаций:
    0
    qqwe
    я задержку к тому чтобы если там в цикле все, код как я уже сказал посмотрел мельком. Да и вообще писать надо на си :derisive:
     
  17. Freeman

    Freeman New Member

    Публикаций:
    0
    тебе надо понять какой ивент перешёл в сигнальное состояние и в зависимости от этого произвести какое-то определенное действие?
    засовываешь все хендлы в WaitForMultiple - оно возвращает либо фигню(нет сигнальных) либо хендл того ивента, который перешёл в сигнальное состояние. по возвращеному хендлу смотреть что делоть дальше. и кстате грузит проц не вызов Вейт а циклы в проге, так что лучше юзать WaitForMultiple (...INFINITE), все равно, как правило, делоть ничего не надо, пока все ивенты не сигнальны.
     
  18. arrrg

    arrrg New Member

    Публикаций:
    0
    та я уже придумал как без эвентов обойтись))