web-dev-qa-db-fra.com

Minuterie périodique simple C ++ Boost ASIO?

Je veux une minuterie périodique très simple pour appeler mon code toutes les 50 ms. Je pourrais faire un fil qui dort pendant 50 ms tout le temps (mais c'est pénible) ... Je pourrais commencer à chercher dans les API Linux pour faire des minuteries (mais ce n'est pas portable) ...

Je voudrais comme pour utiliser boost .. Je ne suis tout simplement pas sûr que ce soit possible. Boost offre-t-il cette fonctionnalité?

25
Scott

Le deuxième exemple sur les tutoriels Boosts Asio l'explique.
Vous pouvez le trouver ici .

Après cela, vérifiez le 3ème exemple pour voir comment vous pouvez l'appeler à nouveau avec un intervalle de temps périodique

19
Default

Un exemple très simple, mais entièrement fonctionnel:

#include <iostream>
#include <boost/asio.hpp>

boost::asio::io_service io_service;
boost::posix_time::seconds interval(1);  // 1 second
boost::asio::deadline_timer timer(io_service, interval);

void tick(const boost::system::error_code& /*e*/) {

    std::cout << "tick" << std::endl;

    // Reschedule the timer for 1 second in the future:
    timer.expires_at(timer.expires_at() + interval);
    // Posts the timer event
    timer.async_wait(tick);
}

int main(void) {

    // Schedule the timer for the first time:
    timer.async_wait(tick);
    // Enter IO loop. The timer will fire for the first time 1 second from now:
    io_service.run();
    return 0;
}

Notez qu'il est très important d'appeler expires_at() pour définir un nouveau délai d'expiration, sinon le temporisateur se déclenchera immédiatement car il est déjà arrivé à échéance.

24
Lucio Paiva

Pour développer davantage cet exemple simple. Cela bloquera l'exécution comme cela a été dit dans les commentaires, donc si vous voulez plus de io_services en cours d'exécution, vous devriez les exécuter dans un thread comme ça ...

boost::asio::io_service io_service;
boost::asio::io_service service2;
timer.async_wait(tick);
boost::thread_group threads;
threads.create_thread(boost::bind(&boost::asio::io_service::run, &io_service));
service2.run();
threads.join_all();
0
jaxkewl

Comme j'ai eu quelques problèmes avec les réponses précédentes, voici mon exemple:

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

void print(const boost::system::error_code&, boost::asio::deadline_timer* t,int* count)
{
    if (*count < 5)
    {
        std::cout << *count << std::endl;
        ++(*count);
        t->expires_from_now(boost::posix_time::seconds(1));
        t->async_wait(boost::bind(print, boost::asio::placeholders::error, t, count));
    }
}

int main()
{ 
    boost::asio::io_service io;
    int count = 0;
    boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));

    t.async_wait(boost::bind(print, boost::asio::placeholders::error, &t, &count));

    io.run();
    std::cout << "Final count is " << count << std::endl;

    return 0;

}

il a fait ce qu'il était censé faire: compter jusqu'à cinq. Puisse-t-il aider quelqu'un.

0
Simon Pfister