Boost async_write problème
je vais vous montrer quelques morceau de code ;
void wh(const boost::system::error_code& ec,
std::size_t bytes_transferred)
{
std::cout << "test";
}
int main(int argc, char* argv[])
{
boost::asio::io_service pService;
boost::asio::serial_port pSerial(pService,"COM4");
while (true) {
boost::asio::async_write(pSerial, boost::asio::buffer("A",1),&wh);
}
return 0;
}
lorsque j'utilise ce code j'obtiens fuite de mémoire, j'ai trouvé un morceau de code comme minicom_client tutoriel, même les plus complexes de ce code aussi je suis de fuite de mémoire sur minicom_client. Si j'utilise
boost::asio::write(pSerial, boost::asio::buffer("A",1));
au lieu de async_write il fonctionne bien, Pourriez-vous expliquer ce qui se passe là-bas , Merci beaucoup ...
Quelle est la version de boost utilisez-vous?
OriginalL'auteur hansen | 2011-02-14
Vous devez vous connecter pour publier un commentaire.
Vous ne l'utilisez pas
async_write
correctement. C'est un composé de l'opération, et c'est à la responsabilité de l'application pour s'assurer qu'aucun d'autres appels àasync_write
surpSerial
sont faites jusqu'à les écrire gestionnaire est appelé. Le la documentation résume ce bienitaliques ajoutés par moi. Pour fixer votre application, vous aurez besoin pour commencer supplémentaires
async_write
les opérations à partir de l'intérieur de votre
wh()
méthode. Vous aurez également besoin d'invoquerio_service::run()
à le coup d'envoi l'événement asynchrone en boucle. Si ce concept est nouveau pour vous, je suggère l'étude de la exemples avant d'écrire votre propre code.Il est également intéressant de noter votre code écrit est dangereux car le tampon d'aller hors de portée avant que le conducteur n'est invoquée. Typiquement, cela est accompli en conservant la mémoire tampon en tant que membre d'un objet qui passe un
boost::shared_ptr
à laasync_write
gestionnaire viaboost::bind
. Cette notion est très répandue dans le pilote asio exemples.Juste pour info: l'extrait de code OP fourni est la plupart du temps correct. La seule chose qu'il ne tient pas compte, c'est qu'il faut plus de temps pour envoyer des données à la sortie du port qu'il n'en faut pour appeler async_write. Vous êtes à la queue d'écrire les événements achèvement dans le io_service file plus vite qu'il peut remplir. La documentation dit que vous ne pouvez pas appeler plus d'une opération d'écriture sur le même objet à partir de plus d'un thread à la fois.
OriginalL'auteur Sam Miller