asio :: lire avec timeout
J'ai besoin de savoir lire (synchronisation ou asynchrone n'a pas d'importance) avec un délai d'attente. Je veux vérifier si un appareil est connecté à un port série ou pas.
Pour que j'utilise asio::write
puis-je attendre la réponse de l'appareil.
Si un périphérique est connecté asio::read(serial, boost::asio::buffer(&r,1))
fonctionne très bien mais si il n'y a aucun dispositif, le programme s'arrête, ce qui est pourquoi j'ai besoin de le délai d'attente
Je sais que j'ai besoin d'un deadline_timer
mais je n'ai aucune idée de comment l'utiliser dans le async_read
fonction.
Un exemple de la façon dont il fonctionne serait vraiment utile.
Je sais qu'il y a beaucoup de semblables fils et j'ai lu beaucoup d'entre eux, mais je ne peux pas trouver une solution qui m'aide à résoudre mon problème!!!!
source d'informationauteur Chris K.
Vous devez vous connecter pour publier un commentaire.
La code posté par Igor R. ne compile pas pour moi. Voici ma version améliorée de son code, qui fonctionne parfaitement. Il utilise des lambdas pour se débarrasser de la
set_result
fonction d'assistance.Vous n'utilisez pas
deadline_timer
dansasync_read
. Mais vous pouvez commencer à vous deux async processus:async_read
processus sur le port série. boost::asio::serial_port a un annuler méthode qui annule toutes les opérations asynchrones.deadline_timer
vous pouvezcancel
le port série. Cela devrait fermer laasync_read
de l'opération et appeler son gestionnaire d'achèvement avec une erreur.Code:
Once upon a time, la bibliothèque, l'auteur a proposé de la façon suivante à lire de façon synchrone avec le délai d'attente (cet exemple consiste à
tcp::socket
mais vous pouvez utiliser le port série à la place):Il n'y a pas un ou facile réponse en soi, car même si vous ne async lire, le rappel n'est jamais appelé et vous avez maintenant un fil libre quelque part autour de.
Vous êtes en droit de supposer que
deadline_timer
est l'une des solutions possibles, mais ça prend de la tripoter et à l'état partagé. Il y a le le blocage de TCP exemplemais c'est pourasync_connect
et il y a une chose cool à propos de ce retour, quand il n'a rien à faire.read
ne le ferai pas, le scénario du pire cas -- va crash & burn 'cause de la ressource non valide. Ainsi, ledeadline timer
chose, c'est une de vos options, mais il y a en fait un plus facile, qui va un peu comme ceci:Fondamentalement, ne le lisez dans un autre thread, et de le tuer si elle arrive à expiration. Vous devriez lire sur Coup de pouce.Fils.
Si vous interrompre, assurez-vous que les ressources sont toutes fermées.