2017-09-05 3 views
3

J'essaye de remplacer la boucle principale dans mon programme (while(1)...select()) par boost::asio::io_service.run(). Le programme a ouvert quelques sockets qui ont été surveillées par select(). La partie délicate est que le FD_SET dans l'instruction select a des descripteurs de fichier socket ainsi que des descripteurs de périphérique char (pour l'entrée matérielle). Dans le code précédent, appeler int fd = open("/dev/button1", O_RDONLY); était suffisant, et que fd a été ajouté à FD_SET. La déclaration select() peut les contrôler toutes.Remplacer select() avec boost :: asio :: io_service

Donc, afin de pouvoir surveiller le périphérique de caractères de boost::asio::io_service, j'ai beaucoup lu sur boost::asio::stream_descriptor. Mais je n'ai pas réussi à le faire fonctionner.

J'ai essayé d'ouvrir le périphérique normalement, puis de créer un stream_descriptor et de l'ajouter à ioservice.

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

Cependant, cela ne fonctionne pas.

+0

Avez-vous envisager d'utiliser [poll (2)] (http://man7.org/linux/man-pages/man2/poll.2.html) au lieu de 'select' ? –

+0

Est-ce que 'btn' peut être hors-champ directement avant que async_read ne fasse vraiment son travail (quand le service io_service est exécuté) et donc qu'il soit détruit et que le callback ne soit jamais appelé? Nous pouvons seulement deviner, le code affiché semble correct, l'erreur est probablement ailleurs. – Matthias247

Répondre

1

Vous ne montrez pas de code qui exécute le io_service (run(), poll(), run_one() ou poll_one()). Donc rien ne se fait.

Un exemple spécifique qui utilise flux descripteur pour lire /dev/inputN est ici:

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

Il utilise simplement ::open pour ouvrir un dispositif (dans ce cas, /dev/input/event2 mais il est juste un nom de fichier que vous pouvez changer).

Notez comment il appelle io_service::run()