Timeout
Un handle per una risorsa di comunicazione ha un set associato di parametri di timeout che influiscono sul comportamento delle operazioni di lettura e scrittura. I timeout possono causare la conclusione di un'operazione ReadFile, ReadFileEx, WriteFileEx o WriteFileEx quando scade un intervallo di timeout, anche se il numero specificato di caratteri non è stato letto o scritto. Non viene considerato come un errore quando si verifica un timeout durante un'operazione di lettura o scrittura, ovvero il valore restituito della funzione di lettura o scrittura indica l'esito positivo. Il numero di byte effettivamente letti o scritti viene segnalato da ReadFile o WriteFile (o dalla funzione GetOverlappedResult o FileIOCompletionRoutine, se l'I/O è stata eseguita come operazione sovrapposta).
Quando un'applicazione apre una risorsa di comunicazione, il sistema imposta i valori di timeout della risorsa sui valori effettivi quando la risorsa è stata usata per l'ultima volta. Se la risorsa di comunicazione non è mai stata aperta, il sistema imposta i valori di timeout su un valore predefinito. In entrambi i casi, un'applicazione deve sempre determinare i valori di timeout correnti dopo l'apertura della risorsa e quindi impostarli in modo esplicito per soddisfare i requisiti. Per determinare i valori di timeout correnti di una risorsa di comunicazione, usare la funzione GetCommTimeouts. Per modificare i valori di timeout, usare la funzione SetCommTimeouts.
Due tipi di timeout sono abilitati dai parametri di timeout. Un timeout di intervallo si verifica quando il tempo tra la ricezione di due caratteri supera un numero specificato di millisecondi. L'intervallo inizia quando viene ricevuto il primo carattere e viene riavviato quando viene ricevuto ogni nuovo carattere. Un timeout totale si verifica quando la quantità totale di tempo utilizzata da un'operazione di lettura supera un numero calcolato di millisecondi. L'intervallo inizia immediatamente all'avvio dell'operazione di I/O. Le operazioni di scrittura supportano solo timeout totali. Le operazioni di lettura supportano sia intervalli che timeout totali, che possono essere usati separatamente o combinati.
Il tempo, espresso in millisecondi, del periodo di timeout totale per un'operazione di lettura o scrittura viene calcolato usando i valori moltiplicatore e costante della struttura COMMTIMEOUTS specificata nella funzione GetCommTimeouts o SetCommTimeouts. Viene utilizzata la seguente formula:
Timeout = (MULTIPLIER * number_of_bytes) + CONSTANT
L'uso di un moltiplicatore e di una costante consente di variare il periodo di timeout totale, a seconda della quantità di dati richiesti. Un'applicazione può usare solo la costante impostando il moltiplicatore su zero oppure solo il moltiplicatore impostando la costante su zero. Se la costante e il moltiplicatore sono zero, il timeout totale non viene usato.
Se tutti i parametri di timeout di lettura sono zero, i timeout di lettura non vengono usati e un'operazione di lettura non viene completata fino a quando non viene letto il numero di byte richiesto o si verifica un errore. Analogamente, se tutti i parametri di timeout di scrittura sono zero, un'operazione di scrittura non viene completata fino a quando non viene scritto il numero di byte richiesto o si verifica un errore.
Se il parametro timeout dell'intervallo di lettura è il valore MAXDWORD e entrambi i parametri di timeout totale di lettura sono pari a zero, un'operazione di lettura viene completata immediatamente dopo la lettura di tutti i caratteri disponibili nel buffer di input, anche se è vuota.
Intervallo forza un'operazione di lettura a restituire quando è presente un lull in ricezione. Un processo che usa timeout di intervallo può impostare un parametro di intervallo piuttosto breve, in modo che possa rispondere rapidamente a picchi isolati di piccole dimensioni di uno o pochi caratteri, ma può comunque raccogliere buffer di caratteri di grandi dimensioni con una singola chiamata quando i dati vengono ricevuti in un flusso costante.
I timeout per un'operazione di scrittura possono essere utili quando la trasmissione viene bloccata da un tipo di controllo del flusso o quando è stata chiamata la funzione SetCommBreak per sospendere la trasmissione dei caratteri.
La tabella seguente riepiloga il comportamento delle operazioni di lettura in base ai valori specificati per i timeout totali e di intervallo.
Totale | Intervallo | Comportamento |
---|---|---|
0 | 0 | Restituisce quando il buffer viene riempito completamente. I timeout non vengono usati. |
T | 0 | Restituisce quando il buffer viene riempito completamente o quando sono trascorsi I millisecondi T dall'inizio dell'operazione. |
0 | Y | Restituisce quando il buffer viene riempito completamente o quando sono trascorsi Y millisecondi tra la ricezione di due caratteri. L'intervallo non inizia finché non viene ricevuto il primo carattere. |
T | Y | Restituisce quando il buffer viene riempito completamente o quando si verifica uno dei tipi di timeout. |
Nota
Tuttavia, tale intervallo è relativo al sistema che controlla il dispositivo fisico. Per un dispositivo remoto, ad esempio un modem, la tempistica è relativa al sistema del server a cui è collegato il modem. Qualsiasi ritardo di propagazione della rete non viene inserito in fattori. Ad esempio, un'applicazione client potrebbe specificare un timeout totale che calcola per essere di 500 millisecondi. Quando sono trascorsi 500 millisecondi nel server, viene restituito un errore di timeout al client. Se si verifica un ritardo di propagazione di rete di 50 millisecondi, il client non riceverà una notifica del timeout fino a circa 50 millisecondi dopo che si è verificato effettivamente il timeout.
Nota
I parametri di timeout influiscono sul comportamento delle operazioni di lettura e scrittura sovrapposte in un dispositivo di comunicazione. Con operazioni di I/O sovrapposte, la funzione ReadFile, WriteFile, ReadFileEx o WriteFileEx può restituire prima del completamento dell'operazione. I parametri di timeout possono determinare quando l'operazione è stata completata.