Auto Reset Event
От: AMurchick  
Дата: 24.10.02 03:02
Оценка:
CreateEvent
The CreateEvent function creates or opens a named or unnamed event object.

HANDLE CreateEvent(
  LPSECURITY_ATTRIBUTES lpEventAttributes, // SD
  BOOL bManualReset,                       // reset type
  BOOL bInitialState,                      // initial state
  LPCTSTR lpName                           // object name
);

...
bManualReset 
[in] Specifies whether a manual-reset or auto-reset event object is created. 
     If TRUE, then you must use the ResetEvent function to manually reset the state to nonsignaled. 
     If FALSE, the system automatically resets the state to nonsignaled 
     after a single waiting thread has been released.


Собственно вопрос — что значит a single waiting thread has been released?
Значит ли это то, что такой event сбросится сразу после завершения функции WaitForSingleObject с кодом возврата WAIT_OBJECT_0 или сброс произойдет только после того, как завершится нитка, в которой был вызов WaitForSingleObject?

Проблема в следующем — объект ждет завершения треда:
void    OBJECT::OBJECT()
{
    sevent = CreateEvent(NULL, FALSE, FALSE, NULL);
}
...
DWORD    WINAPI OBJECT::play_thread(LPVOID dummy)
{
OBJECT    * rd = (OBJECT *)dummy;
...
    SetEvent(rd->sevent);
    return 1;
}

void    OBJECT::stop()
{
....
DWORD    wres = WaitForSingleObject(sevent, 5000);
    if (wres == WAIT_TIMEOUT)
...
}

Первый раз все происходит как надо, но event остается в Signaled state.
Если после WaitForSingleObject вставить ResetEvent(sevent) — то все работает как надо.

PulseEvent() не подходит, т.к. нитка может завершиться раньше, чем будет вызванна WaitForSingleObject.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.