грузит ли waitforsingleobject процессор? если да,то можно ли без помощи этой функции проверить состояние эвента? waitforsingleobject вызывается со вторым параметром,равным нулю.хендл валидный,функция выполняется без ошибок з.ы. имеется блок,в котором есть МНОГО таких вызовов,когда доходит дело до него то нарушается работа всего потока + дико увеличивается загрузка процессора на достаточно неплохом комьютере
arrrg фактически не грузит, что собственно понятно если хоть чуть чуть понимать механизм работы данной функции и потоков в общем. Дальше нече не понял, кода нету я конечно экстрасенс, но мне нужна фотография.
в смысле,что у меня проверяется поочереди много эвентов(206 штук,если быть точным),и в цикле.когда начинается их проверка,дико загружается проц,что вызывает вопрос - грузит ли waitforsingleobject процессор вот что нагуглил Код (Text): Мои мысли такие, что виндосв после продолжения потока (после паузы) временно даёт ему больший приоритет. действительно ли так?имеется ввиду пауза внутри waitforsingleobject
кодес Код (Text): .if COUNTER<6 mov esi,COUNTER invoke GetOFFSET,type CL_ShortString_VAR,esi,addr CTnumbuff mov esi,CTnumbuff lea ebx,Connectionn.V_SSTRING[0] invoke WaitForSingleObject,(CL_ShortString_VAR ptr [esi+ebx]).updateEVENT,0 .if eax==WAIT_TIMEOUT .else mov esi,CTnumbuff lea ebx,Connectionn.V_LSTRING[0] invoke CL_UPDATE_BY_KEY,addr ((CL_ShortString_VAR ptr [esi+ebx]).key) mov esi,CTnumbuff lea ebx,Connectionn.V_SSTRING[0] invoke ResetEvent,(CL_ShortString_VAR ptr [esi+ebx]).updateEVENT inc COUNTER jmp clthrsl1 .endif .endif .if COUNTER<3 mov esi,COUNTER invoke GetOFFSET,type CL_ShortString_VAR,esi,addr CTnumbuff mov esi,CTnumbuff lea ebx,Connectionn.V_LSTRING[0] invoke WaitForSingleObject,(CL_LongString_VAR ptr [esi+ebx]).updateEVENT,0 .if eax==WAIT_TIMEOUT .else mov esi,CTnumbuff lea ebx,Connectionn.V_LSTRING[0] invoke CL_UPDATE_BY_KEY,addr ((CL_LongString_VAR ptr [esi+ebx]).key) mov esi,CTnumbuff lea ebx,Connectionn.V_LSTRING[0] invoke ResetEvent,(CL_LongString_VAR ptr [esi+ebx]).updateEVENT inc COUNTER jmp clthrsl1 .endif .endif .if COUNTER<101 mov esi,COUNTER invoke GetOFFSET,type CL_INT_VAR,esi,addr CTnumbuff mov esi,CTnumbuff lea ebx,Connectionn.V_INT[0] invoke WaitForSingleObject,(CL_INT_VAR ptr [esi+ebx]).updateEVENT,0 .if eax==WAIT_TIMEOUT .else mov esi,CTnumbuff lea ebx,Connectionn.V_INT[0] invoke CL_UPDATE_BY_KEY,addr ((CL_INT_VAR ptr [esi+ebx]).key) mov esi,CTnumbuff lea ebx,Connectionn.V_INT[0] invoke ResetEvent,(CL_INT_VAR ptr [esi+ebx]).updateEVENT inc COUNTER jmp clthrsl1 .endif .endif .if COUNTER<101 mov esi,COUNTER invoke GetOFFSET,type CL_DOUBLE_VAR,esi,addr CTnumbuff mov esi,CTnumbuff lea ebx,Connectionn.V_DOUBLE[0] invoke WaitForSingleObject,(CL_DOUBLE_VAR ptr [esi+ebx]).updateEVENT,0 .if eax==WAIT_TIMEOUT .else mov esi,CTnumbuff lea ebx,Connectionn.V_DOUBLE[0] invoke CL_UPDATE_BY_KEY,addr ((CL_DOUBLE_VAR ptr [esi+ebx]).key) mov esi,CTnumbuff lea ebx,Connectionn.V_DOUBLE[0] invoke ResetEvent,(CL_DOUBLE_VAR ptr [esi+ebx]).updateEVENT inc COUNTER jmp clthrsl1 .endif .endif .if COUNTER<101 inc COUNTER jmp clthrsl1 .endif
Конечно будет нагрузка, так как: If dwMilliseconds is zero, the function does not enter a wait state if the object is not signaled; it always returns immediately. Пользуем WaitForMultipleObjects и не знаем проблем.
стоп...мне нужно использовать WaitForMultipleObjects сразу для всех эвентов или поочереди для каждого и в поле count указать 1?
эм....ну во первых,войди в аську)а во вторых,в том то и фокус,что нужно эвенты проверять отдельно друг от друга
все вэйтилки по событиям суспендят поток (переключают на следующий в планировщике) и возвращают ему управление только после того, как установится запрошеное событие и дойдет до него очередь в планировщике. а таймаут, считайте, просто еще одно событие для оживления потока
qqwe я задержку к тому чтобы если там в цикле все, код как я уже сказал посмотрел мельком. Да и вообще писать надо на си
тебе надо понять какой ивент перешёл в сигнальное состояние и в зависимости от этого произвести какое-то определенное действие? засовываешь все хендлы в WaitForMultiple - оно возвращает либо фигню(нет сигнальных) либо хендл того ивента, который перешёл в сигнальное состояние. по возвращеному хендлу смотреть что делоть дальше. и кстате грузит проц не вызов Вейт а циклы в проге, так что лучше юзать WaitForMultiple (...INFINITE), все равно, как правило, делоть ничего не надо, пока все ивенты не сигнальны.