Простои

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

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

Разрешаются два типа простоев при помощи его параметров. Интервальный простой возникает тогда, когда время между получением каких-либо двух символов выходит за пределы указанного числа миллисекунд. Отсчет времени начинается тогда, когда получен первый символ и повторно запускается, когда принимается каждый новый символ. Общий простой происходит тогда, когда общий объем времени, используемый операцией чтения выходит за пределы расчетного числа миллисекунд. Отсчет времени начинается сразу же, как только начинается операция ввода-вывода (I/O). Операции записи поддерживают только полные простои. Операции чтения поддерживают и интервальные и полные простои, который могут использоваться как отдельно, так и  вместе.

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

Простой = (МНОЖИТЕЛЬ * число_байтов) + КОНСТАНТА

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

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

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

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

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

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

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

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

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

Назад в оглавление
На главную страницу

Hosted by uCoz