Очень полезно сначало прочитать "Шаг 83 - Что такое События (Event) синхронизации". Создается объект событие функцией CreateEvent():
HANDLE CreateEvent
(
LPSECURITY_ATTRIBUTES lpEventAttributes, // атрибут защиты
BOOL bManualReset, // тип сброса TRUE - ручной
BOOL bInitialState, // начальное состояние TRUE - сигнальное
LPCTSTR lpName // имя обьекта
);
Если функция успешна, то вернется дескриптор события. В том случае, если с таким именем событие уже создано, то вернется дескриптор уже созданного события, а GetLastError() вернет код ERROR_ALREADY_EXISTS. Но функция может вернуть и NULL, если объект события создать не удалось совсем. Функция SetEvent() меняет состояние на сигнальное (есть событие).
BOOL SetEvent
(
HANDLE hEvent // дескриптор события
);
В случае успеха вернет ненулевое значение. А функция ResetEvent() меняет состояние на невыделенное (нет события):
BOOL ResetEvent
(
HANDLE hEvent // дескриптор события
);
Пример смотрим.
// TestEvent.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "windows.h"
#include "iostream.h"
#include "process.h"
HANDLE event;
void Test1(void *);
void Test2(void *);
void Test3(void *);
void main()
{
event=CreateEvent(NULL,TRUE,FALSE,"FirstStep");
if (_beginthread(Test1,1024,NULL)==-1)
cout << "Error begin thread " << endl;
if (_beginthread(Test2,1024,NULL)==-1)
cout << "Error begin thread " << endl;
if (_beginthread(Test3,1024,NULL)==-1)
cout << "Error begin thread " << endl;
if (event!=NULL){
Sleep(1000);
SetEvent(event);
Sleep(1000);
ResetEvent(event);
CloseHandle(event);
} else {
cout << "error create event" << endl;
}
}
void Test1(void *)
{
DWORD dwWaitResult;
while(dwWaitResult!=WAIT_OBJECT_0) {
dwWaitResult = WaitForSingleObject(event,1);
cout << "Test 1 TIMEOUT" << endl;
}
cout << "Event Test 1 " << endl;
_endthread();
}
void Test2(void *)
{
DWORD dwWaitResult;
while(dwWaitResult!=WAIT_OBJECT_0){
dwWaitResult = WaitForSingleObject(event,1);
cout << "Test 2 TIMEOUT" << endl;
}
cout << "Event Test 2 " << endl;
_endthread();
}
void Test3(void *)
{
DWORD dwWaitResult;
while(dwWaitResult!=WAIT_OBJECT_0){
dwWaitResult = WaitForSingleObject(event,1);
cout << "Test 3 TIMEOUT" << endl;
}
cout << "Event Test 3 " << endl;
_endthread();
}
Создает объект Event, запускает три потока. Каждый поток ждет когда объект синхронизации перейдет в сигнальное состояние. После некоторой задержки устанавливаем его в сигнальное состояние SetEvent(), выжидаем некоторое время, чтобы потоки среагировали и сбрасываем ResetEvent(). Обратите внимание, что в данном случае в отличии от всех других объектов синхронизации потоков может быть любое количество.
Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.
Используются технологии uCoz
|