Tiempos de espera
Un identificador de un recurso de comunicaciones tiene un conjunto asociado de parámetros de tiempo de espera que afectan al comportamiento de las operaciones de lectura y escritura. Los tiempos de espera pueden hacer que una operación ReadFile, ReadFileEx, WriteFile o WriteFileEx finalice cuando transcurre un intervalo de tiempo de espera, aunque el número especificado de caracteres no se haya leído o escrito. No se trata como un error cuando se produce un tiempo de espera durante una operación de lectura o escritura (es decir, el valor devuelto de la función de lectura o escritura indica que se ha realizado correctamente). El recuento de bytes leídos o escritos realmente se notifica mediante ReadFile o WriteFile (o por la función GetOverlappedResult o FileIOCompletionRoutine , si la E/S se realizó como una operación superpuesta).
Cuando una aplicación abre un recurso de comunicaciones, el sistema establece los valores de tiempo de espera del recurso en los valores en vigor cuando se usó por última vez el recurso. Si el recurso de comunicaciones nunca se ha abierto, el sistema establece los valores de tiempo de espera en algún valor predeterminado. En cualquier caso, una aplicación siempre debe determinar los valores de tiempo de espera actuales después de abrir el recurso y, a continuación, establecerlos explícitamente para cumplir sus requisitos. Para determinar los valores de tiempo de espera actuales de un recurso de comunicaciones, use la función GetCommTimeouts . Para cambiar los valores de tiempo de espera, use la función SetCommTimeouts .
Los parámetros de tiempo de espera habilitan dos tipos de tiempos de espera. Un tiempo de espera de intervalo se produce cuando el tiempo entre la recepción de dos caracteres supera un número especificado de milisegundos. El tiempo se inicia cuando se recibe el primer carácter y se reinicia cuando se recibe cada nuevo carácter. Se produce un tiempo de espera total cuando la cantidad total de tiempo consumido por una operación de lectura supera un número calculado de milisegundos. El tiempo se inicia inmediatamente cuando comienza la operación de E/S. Las operaciones de escritura solo admiten tiempos de espera totales. Las operaciones de lectura admiten intervalos y tiempos de espera totales, que se pueden usar por separado o combinados.
El tiempo, en milisegundos, del período de tiempo de espera total de una operación de lectura o escritura se calcula mediante el multiplicador y los valores constantes de la estructura COMMTIMEOUTS especificada en la función GetCommTimeouts o SetCommTimeouts . Se usa la siguiente fórmula:
Timeout = (MULTIPLIER * number_of_bytes) + CONSTANT
El uso de un multiplicador y una constante permite variar el período de tiempo de espera total, en función de la cantidad de datos que se solicitan. Una aplicación solo puede usar la constante estableciendo el multiplicador en cero o usando solo el multiplicador estableciendo la constante en cero. Si la constante y el multiplicador son cero, no se usa el tiempo de espera total.
Si todos los parámetros de tiempo de espera de lectura son cero, no se usan tiempos de espera de lectura y no se completa una operación de lectura hasta que se haya leído el número solicitado de bytes o se produzca un error. Del mismo modo, si todos los parámetros de tiempo de espera de escritura son cero, no se completa una operación de escritura hasta que se haya escrito el número solicitado de bytes o se produzca un error.
Si el parámetro de tiempo de espera de intervalo de lectura es el valor MAXDWORD y ambos parámetros de tiempo de espera total de lectura son cero, se completa una operación de lectura inmediatamente después de leer los caracteres disponibles en el búfer de entrada, incluso si está vacío.
El intervalo obliga a una operación de lectura a devolver cuando hay una pausa en la recepción. Un proceso que usa tiempos de espera de intervalo puede establecer un parámetro de intervalo bastante corto, por lo que puede responder rápidamente a ráfagas pequeñas y aisladas de uno o varios caracteres, pero todavía puede recopilar grandes búferes de caracteres con una sola llamada cuando los datos se reciben en un flujo estable.
Los tiempos de espera de una operación de escritura pueden ser útiles cuando algún tipo de control de flujo bloquea la transmisión o cuando se ha llamado a la función SetCommBreak para suspender la transmisión de caracteres.
En la tabla siguiente se resume el comportamiento de las operaciones de lectura en función de los valores especificados para los tiempos de espera totales e intervalos.
Total | Intervalo | Comportamiento |
---|---|---|
0 | 0 | Devuelve cuando el búfer se rellena completamente. No se usan tiempos de espera. |
T | 0 | Devuelve cuando el búfer está completamente lleno o cuando han transcurrido T milisegundos desde el principio de la operación. |
0 | Y | Devuelve cuando el búfer se rellena completamente o cuando han transcurrido milisegundos Y entre la recepción de dos caracteres. El tiempo no comienza hasta que se recibe el primer carácter. |
T | Y | Devuelve cuando el búfer se rellena completamente o cuando se produce cualquier tipo de tiempo de espera. |
Nota
Sin embargo, ese tiempo es relativo al sistema que controla el dispositivo físico. En el caso de un dispositivo remoto, como un módem, el tiempo es relativo al sistema de servidor al que está conectado el módem. No se tiene en cuenta ningún retraso de propagación de red. Por ejemplo, una aplicación cliente podría especificar un tiempo de espera total que calcula que es de 500 milisegundos. Cuando han transcurrido 500 milisegundos en el servidor, se devuelve un error de tiempo de espera al cliente. Si hay un retraso de propagación de red de 50 milisegundos, el cliente no recibirá una notificación del tiempo de espera hasta aproximadamente 50 milisegundos después de que realmente se haya agotado el tiempo de espera.
Nota
Los parámetros de tiempo de espera afectan al comportamiento de las operaciones de lectura y escritura superpuestas en un dispositivo de comunicaciones. Con E/S superpuesta, la función ReadFile, WriteFile, ReadFileEx o WriteFileEx puede devolver antes de que se haya completado la operación. Los parámetros de tiempo de espera pueden determinar cuándo se ha completado la operación.