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

www.adept7.kiev.ua
| Форум| Гостевая| Ссылки| Программы| Исходные тексты| Наши партнеры.|
   
| Главная| Рассылки| Услуги| Библиотека| Новости| Авторам| Программистам| Студентам|
delphi c++ assembler
 

Очень полезно сначало прочитать "Шаг 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
 

Rambler's Top100 Rambler's Top100

©  Adept Design Studio

Используются технологии uCoz