Составители:
Рубрика:
При обращении к функции CreateIoCompletionPort() вы можете указать
ключ – 32-битное значение, которое система добавляет в каждое из уведомлений
об успешном осуществлении операций ввода/вывода, связанных с указанным
файлом. Последний аргумент функции CreateIoCompletionPort() служит для
передачи этой функции максимального допустимого количества потоков, ко-
торые будут реагировать на появление уведомлений о завершении вво-
да/вывода. Обычно значение этого аргумента равно нулю.
Любой поток может получить информацию о завершении ввода/вывода
при помощи функции GetQueuedCompletionStatus(). Эта функция возвращает
количество байт, переданных в процессе ввода/вывода, ключ завершения
(32-битное число, установленное при обращении к CreateIoCompletion)
и структуру OVERLAPPED, использованную при инициализации процедуры
ввода/вывода:
BOOL GetQueuedCompletionStatus
(HANDLE CompletionPort,
LPDWORD lpNumberOfBytes,
PULONG_PTR lpCompletionKey,
LPOVERLAPPED *lpOverlapped,
DWORD dwMilliseconds );…
При создании порта завершения ввода/вывода вы можете не ставить ему
в соответствие каких-либо дескрипторов файлов. В этом случае порт завершения
может использоваться в качестве механизма связи между несколькими потоками
одного процесса. При помощи функции PostQueuedCompletionStatus() любой по-
ток может поместить в очередь порта завершения уведомление о завершении вво-
да/вывода. При этом необходимо указать количество переданных байт, ключ за-
вершения и указатель на структуру OVERLAPPED, которая будет возвращена
ожидающему потоку вызовом функции GetQueuedCompletionStatus().
Безусловно, во многих ситуациях вы можете обойтись и без портов заверше-
ния ввода/вывода, однако очень часто этот механизм оказывается весьма удобным.
Еще одной экзотической технологией, поддерживаемой ОС Windows, яв-
ляются файлы, отображенные на память. Менеджер виртуальной памяти Win-
dows позволяет программе работать с файлом таким образом, будто этот файл
полностью загружен в оперативную память компьютера. На самом деле это не
так. Менеджер виртуальной памяти загружает в оперативную память компью-
тера только фрагменты файла (страницы).
Чтобы отобразить файл на оперативную память, откройте его при помощи
функции CreateFile() и передайте дескриптор файла функции CreateFileMap-
ping(). Подробно этот механизм рассмотрен нами ранее при изучении темы
«Управление памятью Windows».
В итоге рассмотрения всех возможностей файлового ввода/вывода возни-
кает вопрос: обязаны ли мы всегда использовать CreateFile() и остальные свя-
занные с этим функции для того, чтобы работать с файлами в Windows? He все-
гда. Если вы ориентируетесь на традиционные методики работы с файлами, вы
69
При обращении к функции CreateIoCompletionPort() вы можете указать
ключ – 32-битное значение, которое система добавляет в каждое из уведомлений
об успешном осуществлении операций ввода/вывода, связанных с указанным
файлом. Последний аргумент функции CreateIoCompletionPort() служит для
передачи этой функции максимального допустимого количества потоков, ко-
торые будут реагировать на появление уведомлений о завершении вво-
да/вывода. Обычно значение этого аргумента равно нулю.
Любой поток может получить информацию о завершении ввода/вывода
при помощи функции GetQueuedCompletionStatus(). Эта функция возвращает
количество байт, переданных в процессе ввода/вывода, ключ завершения
(32-битное число, установленное при обращении к CreateIoCompletion)
и структуру OVERLAPPED, использованную при инициализации процедуры
ввода/вывода:
BOOL GetQueuedCompletionStatus
(HANDLE CompletionPort,
LPDWORD lpNumberOfBytes,
PULONG_PTR lpCompletionKey,
LPOVERLAPPED *lpOverlapped,
DWORD dwMilliseconds );…
При создании порта завершения ввода/вывода вы можете не ставить ему
в соответствие каких-либо дескрипторов файлов. В этом случае порт завершения
может использоваться в качестве механизма связи между несколькими потоками
одного процесса. При помощи функции PostQueuedCompletionStatus() любой по-
ток может поместить в очередь порта завершения уведомление о завершении вво-
да/вывода. При этом необходимо указать количество переданных байт, ключ за-
вершения и указатель на структуру OVERLAPPED, которая будет возвращена
ожидающему потоку вызовом функции GetQueuedCompletionStatus().
Безусловно, во многих ситуациях вы можете обойтись и без портов заверше-
ния ввода/вывода, однако очень часто этот механизм оказывается весьма удобным.
Еще одной экзотической технологией, поддерживаемой ОС Windows, яв-
ляются файлы, отображенные на память. Менеджер виртуальной памяти Win-
dows позволяет программе работать с файлом таким образом, будто этот файл
полностью загружен в оперативную память компьютера. На самом деле это не
так. Менеджер виртуальной памяти загружает в оперативную память компью-
тера только фрагменты файла (страницы).
Чтобы отобразить файл на оперативную память, откройте его при помощи
функции CreateFile() и передайте дескриптор файла функции CreateFileMap-
ping(). Подробно этот механизм рассмотрен нами ранее при изучении темы
«Управление памятью Windows».
В итоге рассмотрения всех возможностей файлового ввода/вывода возни-
кает вопрос: обязаны ли мы всегда использовать CreateFile() и остальные свя-
занные с этим функции для того, чтобы работать с файлами в Windows? He все-
гда. Если вы ориентируетесь на традиционные методики работы с файлами, вы
69
Страницы
- « первая
- ‹ предыдущая
- …
- 67
- 68
- 69
- 70
- 71
- …
- следующая ›
- последняя »
