Шаг 119 - Функции CreateEvent(), SetEvent(), ResetEvent()

Очень полезно сначало прочитать "Шаг 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(). Обратите внимание, что в данном случае в отличии от всех других объектов синхронизации потоков может быть любое количество.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 6.05.2001