booster asio deadline_timer
J'attend le code ci-dessous pour imprimer Hello, world! toutes les 5 secondes, mais ce qui se passe est que le programme s'arrête pendant 5 secondes, puis imprime le message plus et plus avec aucun des pauses. Ce qui me manque?
#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 du code du 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;
}
source d'informationauteur shaz | 2010-08-22
Vous devez vous connecter pour publier un commentaire.
Vous êtes en train de créer le
deadline_timer
comme une variable locale, puis immédiatement à la sortie de la fonction. Cela provoque la minuterie à détruire et à s'annuler lui-même, et les appels de fonction avec un code d'erreur qui vous ignorer, provoquant la boucle infinie.À l'aide d'un seul objet timer, stockée dans un membre ou variable globale, devrait corriger cet.
Si vous regardez le code d'erreur, vous vous êtes opération annulée erreurs.