Tastatureingabe nach bestimmter Zeit abbrechen

trench140

Mitglied
Hallo alle miteinander,

habe hier ein Programm, welches auf User-Input per Tastatur reagieren soll. Erhält es einen bestimmten Input, so soll es solange Videos abspielen, bis mit anderem Input die Wiedergabe unterbrochen wird.

Soweit so gut. Das Abspielen zu starten ist kein Thema. Das stoppen an sich auch nicht. Das Problem ist die fortlaufende Wiedergabe. Wenn ein Video gespielt wird, wird währenddessen weiterhin die Tastatur abgefragt, ob der User die Wiedergabe stoppen möchte. Das ist an sich kein Thema, wenn es nicht das Problem gäbe, dass er das Abspielen nach jedem Video unterbricht, man dann erst IRGENDEINE Taste drücken muss, und er dann erst das nächste Video spielt. Ich möchte aber, dass er eben ohne weitere Nutzerinteraktion fortlaufend abspielt, bis er eben stoppen soll.

Der "kritische" Code-Teil sieht so aus:

Code:
do {
    fread(&ev, sizeof(ev), 1, this->devfd_);
} while (ev.type != EV_KEY);

ev ist ein input_event, this->devfd_ ist ein File-Pointer auf (in meinem Fall) /dev/input/event2.

Nun suche ich nach einer Möglichkeit, diese Abfrage zeitgesteuert zu unterbrechen. Wenn z.B. 100 ms nichts passiert, dann soll im Programm einfach fortgefahren werden.

Hat jemand von euch eine Idee, wie ich das realisieren kann?

Programmiert wird mit C++ unter Linux.

Vielen Dank im Voraus
Trench
 
Hallo,

habe es nun nach einigem Probieren und einiger Flucherei hingekriegt.

Für die, die es interessiert, ich verwende den "select()" dafür.

Code:
int KeyCommander::devfd(void)
{
	std::cout << "KeyCommander::devfd()" << std::endl;
	return fileno(this->devfd_);
}

Bei devfd_ handelt es sich um einen File-Pointer. Mit fileno() stelle ich den File Descriptor fest, den ich für "select()" benötige.

Code:
FD_ZERO(&rfds);
FD_SET(this->keycommander_->devfd(), &rfds);
retvalk = select(this->keycommander_->devfd() + 1, &rfds, NULL, NULL, &timeout);

Zuerst erstelle ich ein neues Set (fd_set *rfds) von File Descriptoren (FD_SET), in meinem Fall einem einzigen (devfd). Dazu muss vorher das Set geleert werden (FD_ZERO).
Abschließend der select-Befehl

Code:
select("File Descriptor mit dem höchsten Wert + 1","File Descriptor Set für zu lesende Daten","File Descriptor Set für zu schreibende Daten","File Descriptor Set für Exceptions", Timeout)

Der Timeout ist ein timeval-Struct, wird innerhalb der hier angegebenen Zeit kein Ereignis erkannt, wird mit dem Programm fortgefahren.

Hoffe, das hilft in Zukunft irgendjemandem ;)

Edit:
Achja, der "Trick" ist übrigens in Abhängigkeit vom Wert von retvalk zu entscheiden, ob die Funktion zum Lesen des Inputs überhaupt gestartet werde muss.

Code:
if(retvalk)
{			
	rc = this->keycommander_->pread();
}

Gruß,
Trench
 
Zuletzt bearbeitet:
Zurück