2010-08-22 2 views
11

Je m'attendais au code ci-dessous pour imprimer Bonjour, monde! Toutes les 5 secondes, mais ce qui se passe, c'est que le programme fait une pause de 5 secondes, puis imprime le message encore et encore sans pauses ultérieures. Qu'est-ce que je rate?boost asio deadline_timer

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

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 ajouter le code de travail ci-dessous. Merci les gars.

#include <iostream> 
#include <boost/bind.hpp> 
#include <boost/thread.hpp> 
#include <boost/asio.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 

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" << endl; 
     wait(); 
    } 

    void cancel() { 
     t.cancel(); 
    } 


private: 
    void wait() { 
     t.expires_from_now(boost::posix_time::seconds(5)); 
     t.async_wait(boost::bind(&Deadline::timeout, this, boost::asio::placeholders::error)); 
    } 

    deadline_timer &t; 
}; 


class CancelDeadline { 
public: 
    CancelDeadline(Deadline &d) :dl(d) { } 
    void operator()() { 
     string cancel; 
     cin >> 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; 
} 
+0

à quoi sert CancelDeadline? J'ai commenté cette classe et 'CancelDeadline cd (d); boost :: thread thr1 (cd); 'et le code fonctionne toujours. – javapowered

+0

Vous pouvez être intéressé par cette question: http://stackoverflow.com/questions/21771639/can-i-use-a-stackful-coroutine-as-the-wait-handler-of-a-steady-timer-which -is-de – updogliu

Répondre

23

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

L'utilisation d'un objet de minuteur unique, stocké dans un membre ou une variable globale, devrait résoudre ce problème.

2

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

+0

Hmm, c'est intéressant et merci de le signaler. Pourquoi supposez-vous que je reçois des erreurs d'opération annulées? – shaz

+0

Découvrez la réponse d'interjay. Cela résout complètement le problème. –

2
#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; 
} 
+3

Vous souhaitez ajouter des commentaires? Avoir une réponse qui n'est que du code aide rarement le demandeur. –

Questions connexes