5 Stimmen

Einstellen einer Zeitüberschreitung auf ifstream in C++?

Wir versuchen, Daten von 2 USB-Mäusen zu lesen, die an eine Linux-Box angeschlossen sind (diese Daten werden für die Odometrie/Lokalisierung auf einem Roboter verwendet). Wir müssen also kontinuierlich von jeder Maus auslesen, wie viel sie sich bewegt hat. Das Problem ist, dass eine Maus, wenn sie sich nicht bewegt, keine Daten sendet, so dass der Dateistrom, aus dem wir die Daten erhalten, die Ausführung blockiert und das Programm daher die Odometrieberechnungen nicht durchführen kann (die Zeitmessung für die Geschwindigkeit beinhalten).

Gibt es eine Möglichkeit, eine Zeitüberschreitung auf den Eingabestrom zu setzen (wir verwenden ifstream in C++ und lesen von /dev/input/mouse), so dass wir in der Lage sind, zu wissen, wenn die Maus nicht bewegt, anstatt auf ein Ereignis zu warten, um empfangen zu werden? Oder müssen wir uns mit Threads herumschlagen (argh...)? Alle anderen Vorschläge sind willkommen!

Vielen Dank im Voraus!

7voto

Marc Punkte 1517

Eine gängige Methode, um unter Linux aus mehreren Dateideskriptoren zu lesen, ist die Verwendung von select(). Ich schlage vor, mit der Manpage . Der grundlegende Systemablauf ist wie folgt:

1) Geräte initialisieren
2) Liste der Gerätedatei-Deskriptoren abrufen
3) Einstellen des Zeitlimits
4) Aufruf von select mit Dateideskriptoren und Timeout als Parameter - es wird blockiert, bis Daten auf einem der Dateideskriptoren vorhanden sind oder das Timeout erreicht ist
5) Stellen Sie fest, warum select zurückgegeben wurde, und handeln Sie entsprechend (d. h. rufen Sie read() für den Dateideskriptor auf, der Daten enthält). Möglicherweise müssen Sie das Ergebnis von read intern puffern, bis ein ganzes Datengramm vorliegt.
6) Schleife zurück zu 4.

Dies kann die Hauptschleife Ihres Programms werden. Wenn Sie bereits eine andere Hauptschleife haben, können Sie die obige Funktion ohne Schleife ausführen, aber Sie müssen sicherstellen, dass die Funktion häufig genug aufgerufen wird, damit Sie keine Daten über die seriellen Schnittstellen verlieren. Sie sollten auch sicherstellen, dass die Aktualisierungsrate (d.h. 1/Timeout) schnell genug für Ihre Hauptaufgabe ist.

Select kann mit jedem Dateideskriptor arbeiten, z. B. mit Netzwerksockets und allem anderen, das eine Schnittstelle über einen Dateideskriptor bereitstellt.

1voto

schnaader Punkte 47961

Was Sie suchen, wäre ein asynchroner Weg, um von ifstream zu lesen, wie Socket-Kommunikation. Das einzige, was helfen könnte, wäre die lesenswert vielleicht zurück, wenn keine Daten verfügbar sind, aber ich bezweifle, dass das hilft.

Die Verwendung von Threads wäre der beste Weg, dies zu handhaben.

0voto

Pontus Gagge Punkte 16933

Werfen Sie einen Blick auf die Asio-Bibliothek verstärken . Dies könnte Ihnen helfen, mit dem von Schnaeder vorgeschlagenen Einfädeln umzugehen.

-1voto

dirkgently Punkte 104289

Nein, eine solche Methode gibt es nicht. Sie müssen auf ein Ereignis warten oder eine benutzerdefinierte Timer-Klasse erstellen und auf eine Zeitüberschreitung warten, um die Abfrage erneut durchzuführen, oder Threads verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X