Délais d'expiration
Un handle pour une ressource de communication a un ensemble associé de paramètres de délai d’attente qui affectent le comportement des opérations de lecture et d’écriture. Les délais d’expiration peuvent entraîner la fin d’une opération ReadFile, ReadFileEx, WriteFile ou WriteFileEx lorsqu’un intervalle de délai d’attente s’écoule, même si le nombre de caractères spécifié n’a pas été lu ou écrit. Elle n’est pas traitée comme une erreur lorsqu’un délai d’attente se produit pendant une opération de lecture ou d’écriture (autrement dit, la valeur de retour de la fonction de lecture ou d’écriture indique la réussite). Le nombre d’octets réellement lus ou écrits est signalé par ReadFile ou WriteFile (ou par la fonction GetOverlappedResult ou FileIOCompletionRoutine , si les E/S ont été effectuées en tant qu’opération superposée).
Lorsqu’une application ouvre une ressource de communication, le système définit les valeurs de délai d’attente de la ressource sur les valeurs en vigueur lors de la dernière utilisation de la ressource. Si la ressource de communication n’a jamais été ouverte, le système définit les valeurs de délai d’attente sur une valeur par défaut. Dans les deux cas, une application doit toujours déterminer les valeurs de délai d’attente actuelles après l’ouverture de la ressource, puis les définir explicitement pour répondre à ses exigences. Pour déterminer les valeurs actuelles de délai d’attente d’une ressource de communication, utilisez la fonction GetCommTimeouts . Pour modifier les valeurs de délai d’attente, utilisez la fonction SetCommTimeouts .
Deux types de délais d’attente sont activés par les paramètres de délai d’attente. Un délai d’expiration d’intervalle se produit lorsque le délai entre la réception de deux caractères quelconques dépasse un nombre spécifié de millisecondes. Le minutage commence lorsque le premier caractère est reçu et redémarré lorsque chaque nouveau caractère est reçu. Un délai d’attente total se produit lorsque la durée totale consommée par une opération de lecture dépasse un nombre calculé de millisecondes. Le minutage démarre immédiatement lorsque l’opération d’E/S commence. Les opérations d’écriture prennent uniquement en charge les délais d’attente totaux. Les opérations de lecture prennent en charge les intervalles et les délais d’attente totaux, qui peuvent être utilisés séparément ou combinés.
Le temps, en millisecondes, du délai d’attente total d’une opération de lecture ou d’écriture est calculé à l’aide des valeurs de multiplicateur et de constante de la structure COMMTIMEOUTS spécifiée dans la fonction GetCommTimeouts ou SetCommTimeouts . La formule utilisée est la suivante :
Timeout = (MULTIPLIER * number_of_bytes) + CONSTANT
L’utilisation d’un multiplicateur et d’une constante permet de varier le délai d’attente total en fonction de la quantité de données demandées. Une application peut utiliser uniquement la constante en définissant le multiplicateur sur zéro, ou utiliser uniquement le multiplicateur en définissant la constante sur zéro. Si la constante et le multiplicateur sont tous deux zéro, le délai d’attente total n’est pas utilisé.
Si tous les paramètres de délai d’attente de lecture sont nuls, les délais d’attente de lecture ne sont pas utilisés et une opération de lecture n’est pas terminée tant que le nombre d’octets demandé n’a pas été lu ou qu’une erreur ne se produit. De même, si tous les paramètres de délai d’attente d’écriture sont nuls, une opération d’écriture n’est pas terminée tant que le nombre d’octets demandé n’a pas été écrit ou qu’une erreur se produit.
Si le paramètre de délai d’attente d’intervalle de lecture est la valeur MAXDWORD et que les deux paramètres de délai d’attente total de lecture sont zéro, une opération de lecture est effectuée immédiatement après la lecture des caractères disponibles dans la mémoire tampon d’entrée, même si elle est vide.
Le minutage de l’intervalle force le retour d’une opération de lecture en cas d’accalmie à la réception. Un processus utilisant des délais d’expiration d’intervalle peut définir un paramètre d’intervalle assez court, de sorte qu’il peut répondre rapidement à de petites rafales isolées d’un ou de quelques caractères, mais il peut toujours collecter des mémoires tampons volumineuses de caractères avec un seul appel lorsque des données sont reçues dans un flux stable.
Les délais d’expiration d’une opération d’écriture peuvent être utiles lorsque la transmission est bloquée par un certain type de contrôle de flux ou lorsque la fonction SetCommBreak a été appelée pour interrompre la transmission de caractères.
Le tableau suivant récapitule le comportement des opérations de lecture en fonction des valeurs spécifiées pour les délais d’attente totaux et d’intervalles.
Total | Intervalle | Comportement |
---|---|---|
0 | 0 | Retourne une fois que la mémoire tampon est complètement remplie. Les délais d’expiration ne sont pas utilisés. |
T | 0 | Retourne lorsque la mémoire tampon est complètement remplie ou lorsque des millisecondes de T se sont écoulées depuis le début de l’opération. |
0 | O | Retourne lorsque la mémoire tampon est complètement remplie ou lorsque des millisecondes Y se sont écoulées entre la réception de deux caractères. Le minutage ne commence pas tant que le premier caractère n’est pas reçu. |
T | O | Retourne lorsque la mémoire tampon est complètement remplie ou lorsque l’un des deux types de délai d’attente se produit. |
Notes
Toutefois, ce minutage est relatif au système qui contrôle l’appareil physique. Pour un appareil distant tel qu’un modem, le minutage est relatif au système serveur auquel le modem est attaché. Aucun retard de propagation réseau n’est pris en compte. Par exemple, une application cliente peut spécifier un délai d’attente total de 500 millisecondes. Lorsque 500 millisecondes se sont écoulées sur le serveur, une erreur de délai d’attente est retournée au client. S’il existe un délai de propagation réseau de 50 millisecondes, le client ne sera pas informé du délai d’attente jusqu’à environ 50 millisecondes après que le délai d’attente s’est réellement produit.
Notes
Les paramètres de délai d’attente affectent le comportement des opérations de lecture et d’écriture qui se chevauchent sur un appareil de communication. Avec les E/S qui se chevauchent, la fonction ReadFile, WriteFile, ReadFileEx ou WriteFileEx peut retourner avant la fin de l’opération. Les paramètres de délai d’attente peuvent déterminer quand l’opération est terminée.