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

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

  1. arrrg

    arrrg New Member

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

    spa Active Member

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

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

    arrrg New Member

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

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    кодес
    Код (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
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Конечно будет нагрузка, так как: 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
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    спасибо,сейчас попробую
     
  7. arrrg

    arrrg New Member

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

    Booster New Member

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

    arrrg New Member

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

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    т.е. попросту сигналить о необходимости произвести какоелибо действие
     
  11. spa

    spa Active Member

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

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    нолик итак стоит
     
  13. arrrg

    arrrg New Member

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

    qqwe New Member

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

    qqwe New Member

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

    spa Active Member

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

    Freeman New Member

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

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    та я уже придумал как без эвентов обойтись))