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.