Составители:
Рубрика:
чем, собственно, завершился вызов функции, необходимо вызвать функцию
GetLastError(). Если этот вызов вернул значение ERROR_IO_PENDING, зна-
чит, запрос на ввод/вывод либо ожидает своей очереди, либо находится в ста-
дии выполнения. Любое другое значение означает, что произошла ошибка.
Если вы обратились к функции ввода/вывода и получили подтверждение
того, что запрос на ввод/вывод находится в процессе исполнения, рано или
поздно вы захотите узнать, когда же все-таки осуществление ввода/вывода за-
вершится? Если вы осуществляете чтение данных, вы не сможете использовать
данные из буфера чтения до того момента, пока не завершится операция чте-
ния. Если вы осуществляете запись, рано или поздно вы должны убедиться
в том, что процедура записи успешно завершена.
Наиболее простой способ проверить текущее состояние запроса на
ввод/вывод – это воспользоваться функцией GetOverlappedResult():
BOOL GetOverlappedResult
(HANDLE hFile, // handle to file, pipe, or device
LPOVERLAPPED lpOverlapped, // overlapped structure
LPDWORD lpNumberOfBytesTransferred, // bytes transferred
BOOL bWait, // wait option);…
В качестве аргументов этой функции необходимо передать дескриптор файла,
указатель на структуру OVERLAPPED, использованную при обращении
к функции ввода/вывода, указатель на переменную, в которую будет занесено ко-
личество переданных байт, и флаг, определяющий, должен ли вызов ждать завер-
шения процедуры ввода/вывода или ему следует немедленно вернуть управление
вызывающей программе, чтобы сообщить ей о текущем состоянии запроса на
ввод/вывод. Если этот флаг имеет значение TRUE и операция ввода/вывода все
еще не завершена, вызов будет ожидать до тех пор, пока операция ввода/вывода
завершится или произойдет ошибка. Если флаг ожидания имеет значение FALSE,
вызов возвращает ошибку (нулевое значение).
Если вызов вернул нулевое значение, а флаг ожидания равен FALSE, не-
обходимо обратиться к GetLastError(). Если этот вызов вернул значение ER-
ROR_IO_INCOMPLETE, значит, процедура ввода/вывода все еще не заверше-
на. Любое другое значение свидетельствует о том, что в ходе выполнения
ввода/вывода произошла ошибка.
Чтобы прервать выполнение операции ввода/вывода, следует использо-
вать функцию CanselIo():
BOOL CancelIo
(HANDLE hFile // handle to file);…
Эта функция отменяет выполнение любых запросов на ввод/вывод, ини-
циированных для некоторого дескриптора файла текущим потоком. Вызов
CanselIo() работает только в отношении процедур перекрывающегося вво-
да/вывода. Очевидно, что если поток инициировал традиционную процедуру
ввода/вывода, он не сможет обратиться к каким-либо другим вызовам до тех
пор, пока процедура ввода/вывода не будет завершена. Если вы прервали вы-
66
чем, собственно, завершился вызов функции, необходимо вызвать функцию
GetLastError(). Если этот вызов вернул значение ERROR_IO_PENDING, зна-
чит, запрос на ввод/вывод либо ожидает своей очереди, либо находится в ста-
дии выполнения. Любое другое значение означает, что произошла ошибка.
Если вы обратились к функции ввода/вывода и получили подтверждение
того, что запрос на ввод/вывод находится в процессе исполнения, рано или
поздно вы захотите узнать, когда же все-таки осуществление ввода/вывода за-
вершится? Если вы осуществляете чтение данных, вы не сможете использовать
данные из буфера чтения до того момента, пока не завершится операция чте-
ния. Если вы осуществляете запись, рано или поздно вы должны убедиться
в том, что процедура записи успешно завершена.
Наиболее простой способ проверить текущее состояние запроса на
ввод/вывод – это воспользоваться функцией GetOverlappedResult():
BOOL GetOverlappedResult
(HANDLE hFile, // handle to file, pipe, or device
LPOVERLAPPED lpOverlapped, // overlapped structure
LPDWORD lpNumberOfBytesTransferred, // bytes transferred
BOOL bWait, // wait option);…
В качестве аргументов этой функции необходимо передать дескриптор файла,
указатель на структуру OVERLAPPED, использованную при обращении
к функции ввода/вывода, указатель на переменную, в которую будет занесено ко-
личество переданных байт, и флаг, определяющий, должен ли вызов ждать завер-
шения процедуры ввода/вывода или ему следует немедленно вернуть управление
вызывающей программе, чтобы сообщить ей о текущем состоянии запроса на
ввод/вывод. Если этот флаг имеет значение TRUE и операция ввода/вывода все
еще не завершена, вызов будет ожидать до тех пор, пока операция ввода/вывода
завершится или произойдет ошибка. Если флаг ожидания имеет значение FALSE,
вызов возвращает ошибку (нулевое значение).
Если вызов вернул нулевое значение, а флаг ожидания равен FALSE, не-
обходимо обратиться к GetLastError(). Если этот вызов вернул значение ER-
ROR_IO_INCOMPLETE, значит, процедура ввода/вывода все еще не заверше-
на. Любое другое значение свидетельствует о том, что в ходе выполнения
ввода/вывода произошла ошибка.
Чтобы прервать выполнение операции ввода/вывода, следует использо-
вать функцию CanselIo():
BOOL CancelIo
(HANDLE hFile // handle to file);…
Эта функция отменяет выполнение любых запросов на ввод/вывод, ини-
циированных для некоторого дескриптора файла текущим потоком. Вызов
CanselIo() работает только в отношении процедур перекрывающегося вво-
да/вывода. Очевидно, что если поток инициировал традиционную процедуру
ввода/вывода, он не сможет обратиться к каким-либо другим вызовам до тех
пор, пока процедура ввода/вывода не будет завершена. Если вы прервали вы-
66
Страницы
- « первая
- ‹ предыдущая
- …
- 64
- 65
- 66
- 67
- 68
- …
- следующая ›
- последняя »
