Timeouts
Ein Handle für eine Kommunikationsressource verfügt über einen zugeordneten Satz von Timeoutparametern, die sich auf das Verhalten von Lese- und Schreibvorgängen auswirken. Timeouts können dazu führen, dass ein ReadFile-, ReadFileEx-, WriteFile- oder WriteFileEx-Vorgang beendet wird, wenn ein Timeoutintervall verstrichen ist, auch wenn die angegebene Anzahl von Zeichen nicht gelesen oder geschrieben wurde. Es wird nicht als Fehler behandelt, wenn während eines Lese- oder Schreibvorgangs ein Timeout auftritt (das heißt, der Rückgabewert der Lese- oder Schreibfunktion gibt den Erfolg an). Die Anzahl der tatsächlich gelesenen oder geschriebenen Bytes wird von ReadFile oder WriteFile (oder von der GetOverlappedResult- oder FileIOCompletionRoutine-Funktion gemeldet, wenn die E/A als überlappender Vorgang ausgeführt wurde).
Wenn eine Anwendung eine Kommunikationsressource öffnet, legt das System die Timeoutwerte der Ressource auf die Werte fest, die bei der letzten Verwendung der Ressource wirksam sind. Wenn die Kommunikationsressource noch nie geöffnet wurde, legt das System die Timeoutwerte auf einen Standardwert fest. In beiden Fällen sollte eine Anwendung immer die aktuellen Timeoutwerte nach dem Öffnen der Ressource ermitteln und diese dann explizit so festlegen, dass sie ihre Anforderungen erfüllen. Verwenden Sie die GetCommTimeouts-Funktion , um die aktuellen Timeoutwerte einer Kommunikationsressource zu ermitteln. Um die Timeoutwerte zu ändern, verwenden Sie die Funktion SetCommTimeouts .
Zwei Arten von Timeouts werden durch die Timeoutparameter aktiviert. Ein Intervalltimeout tritt auf, wenn die Zeit zwischen dem Empfang von zwei beliebigen Zeichen eine angegebene Anzahl von Millisekunden überschreitet. Die Zeitsteuerung beginnt, wenn das erste Zeichen empfangen wird, und wird neu gestartet, wenn jedes neue Zeichen empfangen wird. Ein totales Timeout tritt auf, wenn die Gesamtzeit eines Lesevorgangs eine berechnete Anzahl von Millisekunden überschreitet. Die Zeitsteuerung beginnt sofort, wenn der E/A-Vorgang beginnt. Schreibvorgänge unterstützen nur Gesamtzeitüberschreitungen. Lesevorgänge unterstützen sowohl Intervall- als auch Gesamttimeouts, die separat oder kombiniert verwendet werden können.
Die Zeit des gesamten Timeoutzeitraums für einen Lese- oder Schreibvorgang in Millisekunden wird mithilfe der Multiplikator- und Konstantenwerte aus der COMMTIMEOUTS-Struktur berechnet, die in der GetCommTimeouts - oder SetCommTimeouts-Funktion angegeben sind. Die folgende Formel wird verwendet:
Timeout = (MULTIPLIER * number_of_bytes) + CONSTANT
Wenn Sie sowohl einen Multiplikator als auch eine Konstante verwenden, kann der gesamte Timeoutzeitraum abhängig von der Menge der angeforderten Daten variieren. Eine Anwendung kann nur die Konstante verwenden, indem sie den Multiplikator auf Null festlegt, oder nur den Multiplikator verwenden, indem die Konstante auf 0 festgelegt wird. Wenn sowohl die Konstante als auch der Multiplikator 0 sind, wird das Gesamte timeout nicht verwendet.
Wenn alle Lesetimeoutparameter null sind, werden Lesetimeouts nicht verwendet, und ein Lesevorgang ist erst abgeschlossen, wenn die angeforderte Anzahl von Bytes gelesen wurde oder ein Fehler auftritt. Wenn alle Schreibtimeoutparameter null sind, wird ein Schreibvorgang erst abgeschlossen, wenn die angeforderte Anzahl von Bytes geschrieben wurde oder ein Fehler auftritt.
Wenn der Timeoutparameter des Leseintervalls der MAXDWORD-Wert ist und beide Parameter für das Lesezeitlimit insgesamt 0 sind, wird ein Lesevorgang unmittelbar nach dem Lesen der im Eingabepuffer verfügbaren Zeichen abgeschlossen, auch wenn er leer ist.
Die Intervallzeit erzwingt, dass ein Lesevorgang zurückgegeben wird, wenn es zu einer Flaute im Empfang kommt. Ein Prozess, der Intervalltimeouts verwendet, kann einen relativ kurzen Intervallparameter festlegen, sodass er schnell auf kleine, isolierte Bursts von einem oder wenigen Zeichen reagieren kann, aber er kann trotzdem große Puffer von Zeichen mit einem einzelnen Aufruf sammeln, wenn Daten in einem konstanten Datenstrom empfangen werden.
Timeouts für einen Schreibvorgang können nützlich sein, wenn die Übertragung durch eine Art Flusssteuerung blockiert wird oder wenn die SetCommBreak-Funktion aufgerufen wurde, um die Zeichenübertragung anzusetzen.
In der folgenden Tabelle wird das Verhalten von Lesevorgängen basierend auf den werten zusammengefasst, die für Gesamt- und Intervalltimeouts angegeben sind.
Gesamt | Intervall | Verhalten |
---|---|---|
0 | 0 | Gibt zurück, wenn der Puffer vollständig gefüllt ist. Timeouts werden nicht verwendet. |
T | 0 | Gibt zurück, wenn der Puffer vollständig gefüllt ist oder wenn seit Beginn des Vorgangs T-Millisekunden verstrichen sind. |
0 | J | Gibt zurück, wenn der Puffer vollständig gefüllt ist oder wenn Y-Millisekunden zwischen dem Empfang von zwei Zeichen verstrichen sind. Die Zeitsteuerung beginnt erst, wenn das erste Zeichen empfangen wird. |
T | J | Gibt zurück, wenn der Puffer vollständig gefüllt ist oder wenn ein Timeouttyp auftritt. |
Hinweis
Dieses Timing ist jedoch relativ zum System, das das physische Gerät steuert. Bei einem Remotegerät, z. B. einem Modem, ist die Zeitmessung relativ zum Serversystem, an das das Modem angeschlossen ist. Die Verzögerung der Netzwerkausbreitung wird nicht mit eingeschlossen. Beispielsweise kann eine Clientanwendung ein Gesamtzeitlimit von 500 Millisekunden angeben. Wenn auf dem Server 500 Millisekunden verstrichen sind, wird ein Timeoutfehler an den Client zurückgegeben. Wenn eine Netzwerkweitergabeverzögerung von 50 Millisekunden vorliegt, wird der Client erst nach ca. 50 Millisekunden nach dem tatsächlichen Timeout über das Timeout benachrichtigt.
Hinweis
Die Timeoutparameter wirken sich auf das Verhalten von überlappenden Lese- und Schreibvorgängen auf einem Kommunikationsgerät aus. Bei überlappenden E/A-Vorgängen kann die Funktion ReadFile, WriteFile,ReadFileEx oder WriteFileEx zurückgegeben werden, bevor der Vorgang abgeschlossen wurde. Die Timeoutparameter können bestimmen, wann der Vorgang abgeschlossen wurde.