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.
Halten Sie mit [Umfrage (2)] (http://man7.org/linux/man-pages/man2/poll.2.html) statt 'select' ? –
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