Время ожидания

Дескриптор ресурса связи имеет связанный набор параметров времени ожидания, влияющих на поведение операций чтения и записи. Время ожидания может привести к тому, что операция ReadFile, ReadFileEx, WriteFile или WriteFileEx завершается, когда истекает интервал времени ожидания, даже если указанное число символов не было прочитано или записано. Она не рассматривается как ошибка при возникновении времени ожидания во время операции чтения или записи (т. е. возвращаемое значение функции чтения или записи указывает на успех). Количество байтов, фактически записанных или считываемых, сообщается readFile или WriteFile (или функцией GetOverlappedResult или FileIOCompletionRoutine, если операции ввода-вывода выполнялись как перекрываемая операция).

Когда приложение открывает ресурс обмена данными, система задает значения времени ожидания ресурса значениям, фактическим при последнем использовании ресурса. Если ресурс связи никогда не был открыт, система задает значения времени ожидания для определенного значения по умолчанию. В любом случае приложение всегда должно определять текущие значения времени ожидания после открытия ресурса, а затем явно задать их в соответствии с требованиями. Чтобы определить текущие значения времени ожидания ресурса связи, используйте функцию GetCommTimeouts . Чтобы изменить значения времени ожидания, используйте функцию SetCommTimeouts .

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

Время в миллисекундах общего периода ожидания операции чтения или записи вычисляется с помощью умножения и констант из структуры COMMTIMEOUTS, указанной в функции GetCommTimeouts или SetCommTimeouts. Используется следующая формула:

Timeout = (MULTIPLIER * number_of_bytes) + CONSTANT

Использование умножения и константы позволяет изменять общий период времени ожидания в зависимости от объема запрашиваемых данных. Приложение может использовать только константу, задав умножение на ноль или только умножив, задав константу равным нулю. Если константа и умножение равны нулю, общее время ожидания не используется.

Если все параметры времени ожидания чтения равны нулю, время ожидания чтения не используется, а операция чтения не завершается до тех пор, пока не будет прочитано запрошенное число байтов или возникнет ошибка. Аналогичным образом, если все параметры времени ожидания записи равны нулю, операция записи не завершается до тех пор, пока не будет записано запрошенное число байтов или возникнет ошибка.

Если параметр времени ожидания чтения является значением MAXDWORD , а параметры общего времени ожидания чтения равны нулю, операция чтения завершается сразу после чтения любых символов в входном буфере, даже если она пуста.

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

Время ожидания для операции записи может быть полезно, если передача заблокирована каким-либо элементом управления потоком или когда функция SetCommBreak была вызвана для приостановки передачи символов.

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

Итого Интервал Поведение
0 0 Возвращает, когда буфер полностью заполнен. Время ожидания не используется.
T 0 Возвращает, когда буфер полностью заполнен или когда миллисекундам T истекло с начала операции.
0 Y Возвращает, когда буфер полностью заполнен или когда миллисекунда Y истекает между получением двух символов. Время не начинается до получения первого символа.
T Y Возвращает, когда буфер полностью заполнен или когда происходит любое время ожидания.

 

Примечание

Однако это время относительно системы управления физическим устройством. Для удаленного устройства, например модема, время относительно серверной системы, к которой подключен модем. Любая задержка распространения сети не учитывается. Например, клиентское приложение может указать общее время ожидания, которое вычисляется в 500 миллисекундах. Когда 500 миллисекундах истекли на сервере, время ожидания возвращается клиенту. Если существует задержка распространения сети в 50 миллисекундах, клиент не будет получать уведомления о времени ожидания до примерно 50 миллисекунда после фактического истечения времени ожидания.

 

Примечание

Параметры времени ожидания влияют на поведение перекрывающихся операций чтения и записи на устройстве связи. При перекрытии операций ввода-вывода функция ReadFile, WriteFile, ReadFileEx или WriteFileEx может вернуться до завершения операции. Параметры времени ожидания могут определить, когда операция завершена.