
События
1.
HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttrib,
BOOL fManualReset, BOOL flnitialState, LPCTSTR lpName);
2.
BOOL SetEvent(HANDLE hEvent);
3.
BOOL ResetEvent(HANDLE hEvent);
4.
BOOL PulseEvent(HANDLE hEvent);
5.
BOOL CloseHandle(HANDLE hEvent);
Примеры использования событий.
Пример 1. Два потока по очереди выполняют операции записи-чтения в блоке памяти. Используется одно событие с автосбросом.
HANDLE hEvent;
hEvent = CreateEvent( NULL, FALSE, TRUE, NULL );
// Функция потока 1
DWORD WINAPI ThreadFunc1(PVOID pvParam)
{
…
while (!p->stop)
{
// ожидание освождения события hEvent
WaitForSingleObject(hEvent, INFINITE);
// выполнение операций записи-чтения потоком 1
…
SetEvent( hEvent );
}
…
}
// Функция потока 2
DWORD WINAPI ThreadFunc2(PVOID pvParam)
{
…
while (!p->stop)
{
// ожидание освождения события hEvent
WaitForSingleObject(hEvent, INFINITE);
// выполнение операций записи-чтения потоком 2
…
SetEvent( hEvent );
}
…
}
Пример 2. Два потока параллельно выполняют операции чтения из блока памяти. Используется одно событие с ручным сбросом.
HANDLE hEvent;
hEvent = CreateEvent( NULL, TRUE, TRUE, NULL );
// Функция потока 1
DWORD WINAPI ThreadFunc1(PVOID pvParam)
{
…
while (!p->stop)
{
// ожидание освождения события hEvent
WaitForSingleObject(hEvent, INFINITE);
// выполнение операций чтения потоком 1
}
…
}
// Функция потока 2
DWORD WINAPI ThreadFunc2(PVOID pvParam)
{
…
while (!p->stop)
{
// ожидание освождения события hEvent
WaitForSingleObject(hEvent, INFINITE);
// выполнение операций чтения потоком 2
}
…
}
Пример 3. Два потока последовательно выполняют операции ввода данных и их обработки. Используются два события с автосбросом, одно в свободном состоянии, другое – в занятом.
HANDLE hEvent1, hEvent2;
hEvent1=CreateEvent( NULL, FALSE, TRUE, NULL );
hEvent2=CreateEvent( NULL, FALSE, FALSE, NULL );
// Функция потока 1
DWORD WINAPI ThreadFunc1(PVOID pvParam)
{
…
while (!p->stop)
{
// ожидание освождения события hEvent1
WaitForSingleObject(hEvent1, INFINITE);
// выполнение операций ввода данных потоком 1
…
// перевод события hEvent2 в свобод. состояние
SetEvent(hEvent2);
}
…
}
// Функция потока 2
DWORD WINAPI ThreadFunc2(PVOID pvParam)
{
…
while (!p->stop)
{
// ожидание освождения события hEvent2
WaitForSingleObject(hEvent2, INFINITE);
// выполнение обработки данных потоком 2
…
// перевод события hEvent1 в свобод. состояние
SetEvent(hEvent1);
}
…
}
Ожидаемые таймеры
Ожидаемые таймеры (waitable timers) — это объекты ядра, которые самостоятельно переходят в свободное состояние в определенное время или через регулярные промежутки времени.
Ожидаемые таймеры бывают двух типов: со сбросом вручную и с автосбросом. Когда освобождается таймер со сбросом вручную, возобновляется выполнение всех потоков, ожидавших этот объект, а когда в свободное состояние переходит таймер с автосбросом — лишь одного из потоков.
Функции для работы с ожидаемыми таймерами следующие: