11
votes

Boost ASIO DADERLINE_TIMER

Je m'attendais au code ci-dessous pour imprimer Bonjour, World! Toutes les 5 secondes, mais ce qui se passe est que le programme fait une pause pendant 5 secondes, puis imprime le message encore et encore sans pause ultérieure. Qu'est-ce que je manque? XXX

EDIT Pour ajouter du code de travail ci-dessous. Merci gars. xxx


2 commentaires

Qu'est-ce que Canceldeadline est pour? J'ai commenté cette classe et CD-CDR (D); Boost :: thread thr1 (CD); et le code fonctionne toujours.


Vous êtes peut-être intéressé par cette question: Stackoverflow.com/questions/21771639/...


3 Réponses :


2
votes

Si vous regardez le code d'erreur, vous obtenez une opération d'utilisation des erreurs annulées.


2 commentaires

Hmm, c'est intéressant et merci de pointer cela. Pourquoi supposez-vous que je reçoive des erreurs annulées?


Découvrez la réponse de Interjay. Qui fixe complètement le problème.



27
votes

Vous créez le mortsline_timer en tant que variable locale, puis en sortant immédiatement la fonction. Cela provoque la détruite et l'annulation de la minuterie et appelle votre fonction avec un code d'erreur que vous ignorez, causant la boucle infinie.

Utilisation d'un seul objet de minuterie, stocké dans un membre ou une variable globale, devrait résoudre ce problème.


0 commentaires

3
votes
#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

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;
}

1 commentaires

Soin pour ajouter une sorte de commentaires? Avoir une réponse que seuls le code aide rarement réellement l'orchestre de la question.