Tempos limite

Um identificador para um recurso de comunicação tem um conjunto associado de parâmetros de tempo limite que afetam o comportamento das operações de leitura e gravação. Os tempos limite podem fazer com que uma operação ReadFile, ReadFileEx, WriteFile ou WriteFileEx seja concluída quando um intervalo de tempo limite expirar, mesmo que o número especificado de caracteres não tenha sido lido ou gravado. Ele não é tratado como um erro quando um tempo limite ocorre durante uma operação de leitura ou gravação (ou seja, o valor de retorno da função de leitura ou gravação indica êxito). A contagem de bytes realmente lidos ou gravados é relatada por ReadFile ou WriteFile (ou pela função GetOverlappedResult ou FileIOCompletionRoutine, se a E/S foi executada como uma operação sobreposta).

Quando um aplicativo abre um recurso de comunicação, o sistema define os valores de tempo limite do recurso para os valores em vigor quando o recurso foi usado pela última vez. Se o recurso de comunicação nunca tiver sido aberto, o sistema definirá os valores de tempo limite como algum valor padrão. Em ambos os casos, um aplicativo deve sempre determinar os valores de tempo limite atuais depois de abrir o recurso e, em seguida, defini-los explicitamente para atender aos seus requisitos. Para determinar os valores de tempo limite atuais de um recurso de comunicação, use a função GetCommTimeouts . Para alterar os valores de tempo limite, use a função SetCommTimeouts.

Dois tipos de tempos limite são habilitados pelos parâmetros de tempo limite. Um tempo limite de intervalo ocorre quando o tempo entre o recebimento de quaisquer dois caracteres excede um número especificado de milissegundos. O tempo começa quando o primeiro caractere é recebido e é reiniciado quando cada novo caractere é recebido. Um tempo limite total ocorre quando a quantidade total de tempo consumido por uma operação de leitura excede um número calculado de milissegundos. O tempo começa imediatamente quando a operação de E/S começa. As operações de gravação oferecem suporte apenas a tempos limite totais. As operações de leitura oferecem suporte a tempos limite de intervalo e total, que podem ser usados separadamente ou combinados.

O tempo, em milissegundos, do período de tempo limite total para uma operação de leitura ou gravação é calculado usando o multiplicador e os valores constantes da estrutura COMMTIMEOUTS especificada na função GetCommTimeouts ou SetCommTimeouts. Esta é a fórmula usada:

Timeout = (MULTIPLIER * number_of_bytes) + CONSTANT

O uso de um multiplicador e de uma constante permite que o período de tempo limite total varie, dependendo da quantidade de dados que está sendo solicitada. Um aplicativo pode usar somente a constante definindo o multiplicador como zero, ou usar apenas o multiplicador definindo a constante como zero. Se a constante e o multiplicador forem zero, o tempo limite total não será usado.

Se todos os parâmetros de tempo limite de leitura forem zero, os tempos limite de leitura não serão usados e uma operação de leitura não será concluída até que o número solicitado de bytes tenha sido lido ou ocorra um erro. Da mesma forma, se todos os parâmetros de tempo limite de gravação forem zero, uma operação de gravação não será concluída até que o número solicitado de bytes tenha sido gravado ou ocorra um erro.

Se o parâmetro de tempo limite do intervalo de leitura for o valor MAXDWORD e ambos os parâmetros de tempo limite total de leitura forem zero, uma operação de leitura será concluída imediatamente após a leitura dos caracteres disponíveis no buffer de entrada, mesmo que esteja vazio.

O tempo de intervalo força uma operação de leitura a retornar quando há uma calmaria na recepção. Um processo usando tempos limite de intervalo pode definir um parâmetro de intervalo bastante curto, para que possa responder rapidamente a pequenas rajadas isoladas de um ou alguns caracteres, mas ainda pode coletar grandes buffers de caracteres com uma única chamada quando os dados são recebidos em um fluxo constante.

Os tempos limite para uma operação de gravação podem ser úteis quando a transmissão é bloqueada por algum tipo de controle de fluxo ou quando a função SetCommBreak foi chamada para suspender a transmissão de caracteres.

A tabela a seguir resume o comportamento das operações de leitura com base nos valores especificados para tempos limite total e intervalar.

Total Intervalo Comportamento
0 0 Retorna quando o buffer está completamente preenchido. Os tempos limite não são usados.
T 0 Retorna quando o buffer está completamente preenchido ou quando milissegundos T se passaram desde o início da operação.
0 Y Retorna quando o buffer está completamente preenchido ou quando milissegundos Y se passaram entre o recebimento de quaisquer dois caracteres. O tempo não começa até que o primeiro caractere seja recebido.
T Y Retorna quando o buffer está completamente preenchido ou quando ocorre um tipo de tempo limite.

 

Observação

No entanto, esse tempo é relativo ao sistema que controla o dispositivo físico. Para um dispositivo remoto, como um modem, o tempo é relativo ao sistema de servidor ao qual o modem está conectado. Qualquer atraso de propagação de rede não é considerado. Por exemplo, um aplicativo cliente pode especificar um tempo limite total que calcula como sendo 500 milissegundos. Quando 500 milissegundos tiverem decorrido no servidor, um erro de tempo limite será retornado ao cliente. Se houver um atraso de propagação de rede de 50 milissegundos, o cliente não será notificado do tempo limite até aproximadamente 50 milissegundos após o tempo limite realmente ter ocorrido.

 

Observação

Os parâmetros de tempo limite afetam o comportamento de operações de leitura e gravação sobrepostas em um dispositivo de comunicação. Com E/S sobreposta, a função ReadFile, WriteFile, ReadFileEx ou WriteFileEx pode retornar antes que a operação seja concluída. Os parâmetros de tempo limite podem determinar quando a operação foi concluída.