Основы программирования в Win32API. Марапулец Ю.В. - 32 стр.

UptoLike

Составители: 

количество потоков, которые могут завладеть семафором. Обратите внимание,
что функция CreateSemaphore() позволяет при создании нового семафора при-
своить его счетчику значение меньше максимального. Например, при разра-
ботке нового семафора его счетчику можно задать начальное значение 0. Та-
кой прием позволит заблокировать все потоки до тех пор, пока программа не
произведет инициализацию, а затем не увеличит значение счетчика с помощью
команды ReleaseSemaphore().
Не забывайте вовремя освобождать синхронизирующие объекты. Не задав
максимального времени ожидания и забыв освободить исключающий семафор,
вы заблокируете все ожидающие его потоки.
Поток может ожидать несколько сигналов от одного и того же объекта, не бу-
дучи заблокированным, однако после завершения каждого из процессов ожидания
необходимо выполнять операцию освобождения. Это требование справедливо для
семафоров, исключающих семафоров и критических разделов.
2.4.3. Объект - событие
Событие представляет собой объект, который создается программой при
необходимости информировать потоки о выполнении определенных действий.
В простейшем случае (ручной сброс) событие переключает свое состояние
с помощью команд SetEvent() – сигнал включен и ResetEvent() – сигнал вы-
ключен. Когда сигнал включается, его получают все потоки, которые ожидают
появления соответствующего события. Если сигнал выключается, все такие
потоки блокируются. В отличие от семафоров и исключающих семафоров со-
бытия данного типа изменяют свое состояние только при подаче соответст-
вующей команды каким-нибудь потоком.
События целесообразно использовать при условии, что поток должен вы-
полняться только после того, как программа обновит свое окно или пользова-
тель введет определенную информацию [2]. Ниже представлены основные
функции, предназначенные для работы с событиями:
HANDLE CreateEvent
(LPSECURITY_ATTRIBUTES lpsa, // привилегии доступа
// (по умолчанию = NULL)
BOOL bManualReset, // TRUE – событие должно быть сброшено вручную
BOOL bInitialState, // TRUE – создание события в сигнальном состоянии
LPTSTR lpszEventName, //имя события (допускается значение NULL));
BOOL SetEvent (HANDLE hEvent);
BOOL ResetEvent(HANDLE hEvent);…
При установке параметра bInitialState функция CreateEvent() создает со-
бытие, которое сразу же будет находиться в сигнальном состоянии. Функции
SetEvent() и ResetEvent() в случае успешного завершения возвращают значение
TRUE,
при возникновении ошибкизначение FALSE.
32
количество потоков, которые могут завладеть семафором. Обратите внимание,
что функция CreateSemaphore() позволяет при создании нового семафора при-
своить его счетчику значение меньше максимального. Например, при разра-
ботке нового семафора его счетчику можно задать начальное значение 0. Та-
кой прием позволит заблокировать все потоки до тех пор, пока программа не
произведет инициализацию, а затем не увеличит значение счетчика с помощью
команды ReleaseSemaphore().
     Не забывайте вовремя освобождать синхронизирующие объекты. Не задав
максимального времени ожидания и забыв освободить исключающий семафор,
вы заблокируете все ожидающие его потоки.
     Поток может ожидать несколько сигналов от одного и того же объекта, не бу-
дучи заблокированным, однако после завершения каждого из процессов ожидания
необходимо выполнять операцию освобождения. Это требование справедливо для
семафоров, исключающих семафоров и критических разделов.


                           2.4.3. Объект - событие

    Событие представляет собой объект, который создается программой при
необходимости информировать потоки о выполнении определенных действий.
В простейшем случае (ручной сброс) событие переключает свое состояние
с помощью команд SetEvent() – сигнал включен и ResetEvent() – сигнал вы-
ключен. Когда сигнал включается, его получают все потоки, которые ожидают
появления соответствующего события. Если сигнал выключается, все такие
потоки блокируются. В отличие от семафоров и исключающих семафоров со-
бытия данного типа изменяют свое состояние только при подаче соответст-
вующей команды каким-нибудь потоком.
    События целесообразно использовать при условии, что поток должен вы-
полняться только после того, как программа обновит свое окно или пользова-
тель введет определенную информацию [2]. Ниже представлены основные
функции, предназначенные для работы с событиями:
HANDLE CreateEvent
    (LPSECURITY_ATTRIBUTES lpsa,               // привилегии доступа
                                              // (по умолчанию = NULL)
    BOOL bManualReset, // TRUE – событие должно быть сброшено вручную
    BOOL bInitialState, // TRUE – создание события в сигнальном состоянии
    LPTSTR lpszEventName, //имя события (допускается значение NULL));
    BOOL SetEvent (HANDLE hEvent);
    BOOL ResetEvent(HANDLE hEvent);…

    При установке параметра bInitialState функция CreateEvent() создает со-
бытие, которое сразу же будет находиться в сигнальном состоянии. Функции
SetEvent() и ResetEvent() в случае успешного завершения возвращают значение
TRUE, при возникновении ошибки – значение FALSE.

                                      32