boost asio delay_timer

Je m’attendais à ce que le code ci-dessous imprime Hello, world! toutes les 5 secondes, mais le programme fait une pause de 5 secondes, puis imprime le message encore et encore, sans pause supplémentaire. Qu’est-ce que je rate?

#include  #include  #include  using namespace boost::asio; using namespace std; io_service io; void print(const boost::system::error_code& /*e*/) { cout << "Hello, world!\n"; deadline_timer t(io, boost::posix_time::seconds(5)); t.async_wait(print); } int main() { deadline_timer t(io, boost::posix_time::seconds(5)); t.async_wait(print); io.run(); return 0; } 

modifier pour append le code de travail ci-dessous. Merci les gars.

 #include  #include  #include  #include  #include  using namespace boost::asio; using namespace std; class Deadline { public: Deadline(deadline_timer &timer) : t(timer) { wait(); } void timeout(const boost::system::error_code &e) { if (e) return; cout << "tick" <> cancel; dl.cancel(); return; } private: Deadline &dl; }; int main() { io_service io; deadline_timer t(io); Deadline d(t); CancelDeadline cd(d); boost::thread thr1(cd); io.run(); return 0; } 

Vous créez le deadline_timer tant que variable locale, puis vous quittez immédiatement la fonction. Cela provoque la destruction et l’annulation de la timer et appelle votre fonction avec un code d’erreur que vous ignorez, ce qui provoque la boucle infinie.

L’utilisation d’un seul object timer, stocké dans un membre ou une variable globale, devrait résoudre ce problème.

Si vous regardez le code d’erreur, vous obtenez des erreurs annulées par l’opération.

 #include  #include  #include  using namespace boost::asio; using namespace std; io_service io; deadline_timer t(io, boost::posix_time::seconds(5)); void print(const boost::system::error_code& /*e*/) { cout << "Hello, world!\n"; t.expires_from_now(boost::posix_time::seconds(5)); t.async_wait(print); } int main() { //deadline_timer t(io, boost::posix_time::seconds(5)); t.async_wait(print); io.run(); return 0; }