Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Расширенный ввод-вывод с процедурами завершения



Вместо того чтобы заставлять поток ожидать сигнала завершения от события или дескриптора, система может вызвать указанную пользователем процедуру завершения, когда операция вво­да-вывода закончится. Эта процедура завершения может запустить следующую опера­цию ввода-вывода и выполнить любое другое действие.

Как программа может задать процедуру завершения? Существует семейство расширенных функций вво­да-вывода, отличающихся суффиксом Ех, которые имеют дополнительный параметр для адреса процедуры завершения. Расширенные функции чтения и записи — ReadFileEx и WriteFileEx. Кроме того, следует использовать одну из пяти ожидающих функций предупреждения.

• WaitForSingleObjectEx

• WaitForMultipleObjectsEx

• SleepEx

• SignalObjectAndWait

• MsgWaitForMultipleObjectsEx

Расширенный ввод-вывод иногда называется вводом-выводом с предупреждением.

Порты завершения ввода-вывода

Порты завершения ввода-вывода объединяют возможности ввода-вывода с перекрытием и возможности независимых потоков и наиболее полезны в серверных программах.

Порты завершения ввода-вывода позволяют создавать ограниченное количество потоков сервера в группе потоков при наличии очень большого числа дескрипторов именованных каналов (или сокетов). Дескрипто­ры не связаны с отдельными потоками-рабочими сервера, но поток сервера может об­рабатывать данные от любого дескриптора, на котором они доступны.

Следовательно, порт завершения ввода-вывода представляет собой набор дескрипторов с перекрытием, а потоки ожидают сигнала порта. Когда чтение или запись на одном из дескрипторов заканчиваются, один поток переходит в активное состояние и получает данные и результаты операции ввода-вывода. После этого он может обрабо­тать данные и снова ожидать сигнала порта.

Первая задача состоит в том, чтобы создать порт завершения ввода-вывода и вне­сти в него дескрипторы с перекрытием.

Управление портами завершения ввода-вывода

Функция CreateIoCompletionPort служит как для создания порта, так и для добавления дескрипторов. Поскольку она должна выполнять две задачи, порядок использования ее параметров довольно сложен.

HANDLE CreateIoCompletionPort (HANDLE FileHandle,

HANDLE ExistingCompletionPort, DWORD CompletionKey,

DWORD NumberOfConcurrentThreads);

Параметры

Порт завершения ввода-вывода — это совокупность дескрипторов файлов, откры­тых в режиме OVERLAPPED. Параметр FileHandle — это асинхронный дескриптор, который добавляется в порт. Если в этом параметре указать значение INVALID_HANDLE_VALUE, функция создает новый порт завершения ввода-вывода и возвращает его как возвращаемое значение. Следующий параметр, ExistingCompletionPort, в этом случае должен иметь значение NULL.

ExistingCompletionPort — порт, созданный при первом вызове, и порт, в кото­рый добавляется дескриптор из первого параметра. Если добавление прошло успешно, функция также возвращает дескриптор порта, при неудаче возвращается NULL.

CompletionKey задает ключ, который будет входить в пакет завершения для FileHandle. Этот ключ обычно является индексом массива структур данных, содержащих тип операции, дескриптор и указатель на буфер данных.

NumberOfConcurrentThreads указывает максимальное число потоков, которые могут работать одновременно. Все потоки вне этого предела, ожидающие сигнала порта, остают­ся заблокированными. Если этот параметр равен нулю, пределом будет число процессоров в системе.

С портом завершения ввода-вывода можно связать. неограниченное количество асинхронных дескрипторов. При первом вызове CreateIoCompletionPort создается порт и определяется максимальное число потоков. Для каждого дескриптора, который должен быть связан с портом, эту функцию надо вызывать снова. К сожалению, не существует способа удаления дескриптора из порта завершения.

Дескрипторы, связанные с портом, не должны использоваться в функциях ReadFileEx или WriteFileEx. В документации Microsoft не рекомендуется совместно использовать файлы или другие объекты с помощью других открытых дескрипторов. [kgl].

Основная литература: [1] – 46 - 52 c., 359 – 386 с.

Контрольные вопросы:

1. Каким устройствам обычно назначаются стандартные устройства?

2. Специальные функции консольного ввода-вывода

метода выполнения асинхронного ввода-вывода

[gl] Лекция 13. Тема: Безопасность объектов Win32[:]





Дата публикования: 2015-11-01; Прочитано: 581 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...