2017-09-05 3 views
3

Ich versuche, die Hauptschleife in meinem Programm (while(1)...select()) durch boost::asio::io_service.run() zu ersetzen. Das Programm hat ein paar Sockets offen, die von select() überwacht wurden.Ersetzen von Select() mit boost :: asio :: io_service

Der schwierige Teil ist, dass die FD_SET in der Select-Anweisung Socket-Dateideskriptoren sowie Char-Gerätedeskriptoren (für die Hardware-Eingabe) hat. Im vorherigen Code war der Aufruf von int fd = open("/dev/button1", O_RDONLY); genug, und das fd wurde FD_SET hinzugefügt. Die Anweisung select() kann alle überwachen.

Also, um das Zeichen Gerät von boost::asio::io_service zu überwachen, habe ich viel über boost::asio::stream_descriptor gelesen. Aber ich konnte es nicht zur Arbeit bringen.

Ich habe versucht, das Gerät normal zu öffnen und dann einen stream_descriptor zu erstellen und es dem ioservice hinzuzufügen.

int fd = open("/dev/button1", O_RDONLY); 
boost::asio::posix::stream_descriptor btn(io_service, fd); 
boost::asio::async_read(btn, buffer, &button_callback); 

Allerdings funktioniert das nicht.

+0

Halten Sie mit [Umfrage (2)] (http://man7.org/linux/man-pages/man2/poll.2.html) statt 'select' ? –

+0

Kann 'btn' direkt außerhalb von scope sein, bevor async_read wirklich funktioniert (wenn der io_service ausgeführt wird) und deshalb zerstört wird und der Callback nie aufgerufen wird? Wir können nur raten, der angezeigte Code sieht gut aus, der Fehler ist wahrscheinlich woanders. – Matthias247

Antwort

1

Sie keinen Code zeigen, der die io_service läuft (run(), poll(), run_one() oder poll_one()). Also wird nichts gemacht.

Ein spezifisches Beispiel, das Strom-Beschreiber von /dev/inputN zu lesen verwendet, ist hier:

boost::asio read from /dev/input/event0

Es ::open nur ein Gerät verwendet zu öffnen (in diesem Fall /dev/input/event2 aber es ist nur ein Dateiname geändert werden können).

Beachten Sie, wie es nennt io_service::run()

Verwandte Themen