Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
spo_samoe.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1.54 Mб
Скачать
  1. События. Виды событий. Примеры записи функций Win32 api для создания и использования событий. Пример использования событий для синхронизации конкурирующих и сотрудничающих потоков.

Для передачи из одного потока событий в другой требуются события синхронизации — объекты, обладающие одним их двух состояний (с сигналом или без сигнала), применяющиеся для активации и приостановки потоков. Потоки можно приостанавливать, заставляя их ожидать события без сигнала, и активировать, меняя состояние на состояние с сигналом.

События бывают двух типов:

  • Сброс вручную -ManualResetEvent.

  • Сбрасываются автоматически- AutoResetEvent

Разница в том, что первый вид события нужно применять если события ждут несколько потоков. Только сброс вручную позволяет это сделать. Иначе первый же обработчик сбросит событие и другие потоки об этом не узнают. Реализуется это так. Объявляется переменная события типа HANDLE. Для создания события используется функция CreateEvent(), для доступа OpenEvent(), для установки события две функции SetEvent() и PulseEvent(). Для сброса события используется функция ResetEvent(). Дескриптор события после окончания работы нужно закрыть. Объект событие может находиться в двух состояниях - занят и свободен.

  1. Функция Win32 API ожидания одного события. Примеры использования функции.+

  1. Функция Win32 api ожидания нескольких событий. Пример использования функции.

Win32 API поддерживает целый ряд функций, которые начинаются с Wait. Это ожидающие функции. Смысл их в том, что они блокируют выполнение потока до наступления какого-то события или тайм-аута.

WaitForMultipleObjects

WaitForMultipleObjectsEx

WaitForSingleObject

WaitForSingleObjectEx

MsgWaitForMultipleObjects

MsgWaitForMultipleObjectsEx

Функции где в имени есть Single предназначены для установки одного синхронизирующего объекта, а где есть Multiple можно установить ожидание сразу нескольким объектам. Функции с префиксами Msg предназначены для ожидания события определенного типа, например, ввода с клавиатуры. Функции с окончанием Ex расширены опциями по управлению асинхронным вводом-выводом.

Для того, чтобы пользоваться этими функциями должен быть объект синхронизации, который эти функции и проверяют. У этих объектов два состояния: установлен и сброшен. При вызове этих функций им передается указатель на объект синхронизации. Объект проверяется. Если он не установлен, то функция будет ждать пока не истечет тайм-аут. Все это время поток будет блокирован. Например,

Простейшей функцией ожидания является функция WaitForSingleObject:

function WaitForSingleObject(

hHandle: THandle; // идентификатор объекта

dwMilliseconds: DWORD // период ожидания

): DWORD; stdcall;

Функция ожидает перехода объекта hHandle в сигнальное состояние в течение dwMilliseconds миллисекунд. Если в качестве параметра dwMilliseconds передать значение INFINITE, функция будет ждать в течение неограниченного времени. Если dwMilliseconds равен 0, то функция проверяет состояние объекта и немедленно возвращает управление.

Функции, ожидающие несколько объектов

Иногда требуется задержать выполнение потока до срабатывания одного или сразу всех из группы объектов. Для решения подобной задачи используются следующие функции:

function MsgWaitForMultipleObjects(

nCount: DWORD; // количество объектов синхронизации

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]