Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метода Процессы и потоки.doc
Скачиваний:
7
Добавлен:
14.07.2019
Размер:
401.92 Кб
Скачать

CreateEvent

Описание Функция CreateEvent создает поименованный или безымянный объект события, который может программным путем быть переведен в сигнальное или несигнальное состояние с помощью функции SetEvent. События ис­пользуются в приложении для уведомления нитей о соответствующих дей­ствиях, а также для синхронизации нитей. Например, одна нить создает событие и устанавливает его в несигнальное состояние. Другая нить ис­пользует дескриптор события, полученный с помощью функции WaitFor-SingleObject, для ожидания момента перехода этого события в сигнальное состояние. После того как первая нить установит событие в сигнальное со­стояние, вторая нить продолжит свое выполнение.

Синтаксис HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpSecurityAttribs, BOOL bManualReset, BOOL nInitialState, LPCTSTR lpszEventName)

Возвращаемое значение HANDLE: Если выполнение рассматриваемой функции оказывается успешным, возвращается дескриптор объекта события. В противном случае возвращается NULL. Если же поименованный объект события существовал до вызова рассматриваемой функции, функция GetLastError возвращает код ошибки ERROR_ALREADY_EXIST, а иначе - 0.

Включаемый файл winbase.h

См. также CreateProcess, DuplicateHandle, OpenEvent, ResetEvent, SetEvent, WaitForSingleObject, WaitForMultipleObjects.

Пример В приведенном ниже примере показано, каким образом сбрасываемые вручную события и семафоры используются для написания синхронизи­рованного кода, предназначенного для управления доступом процесса к ресурсам. Имеются четыре пункта меню: Read, Write, Quit и Help. Чтобы было удобнее наблюдать за тем, как действует синхронизация, необходи­мо запустить на выполнение три экземпляра приложения и расположить их на рабочем столе без перекрытий. Затем в двух экземплярах следует выбрать пункт меню Read, а в третьем экземпляре – пункт меню Write. Между читающими процессами конфликт отсутствует, однако записыва­ющий процесс должен ожидать до тех пор, пока читающие процессы не завершатся, прежде чем продолжить свое выполнение. Далее следует выб­рать операцию записи и две операции чтения. В этом случае операции чтения должны ожидать до тех пор, пока не завершится операция запи­си. Текущее состояние каждого про­цесса отображается в строке заго­ловка соответствующего экземпляра приложения.

CrEvent.h

#define IDM_EXIT 100

#define IDM_READ 200

#define IDM_WRITE 201

#define IDM_ABOUT 301

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

LRESULT CALLBACK About (HWND, UINT, WPARAM, LPARAM);

CrEvent.rc

#include "windows.h"

#include "CrEvent.h"

MYAPP ICON DISCARDABLE "GENERIC.ICO"

MYAPP MENU DISCARDABLE

BEGIN

POPUP "&File"

BEGIN

MENUITEM "&Read", IDM_READ

MENUITEM "&Write", IDM_WRITE

MENUITEM SEPARATOR

MENUITEM "E&xit", IDM_EXIT

END

POPUP "&Help"

BEGIN

MENUITEM "&About My Application...", IDM_ABOUT

END

END

ABOUTBOX DIALOG 22, 17, 171, 43

STYLE DS_MODALFRAME | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU

CAPTION "My Application"

FONT 8, "MS Sans Serif"

{

CONTROL "MyApp", -1, "STATIC", SS_ICON | WS_CHILD | WS_VISIBLE, 3, 2, 16, 16

CONTROL "Generic Application", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 28, 4, 100, 8

CONTROL "OK", IDOK, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 116, 26, 50, 14

}