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