ASIO периодический таймер - PullRequest
       4

ASIO периодический таймер

1 голос
/ 06 декабря 2011

Я хочу реализовать подобный Java таймер с помощью таймера asio, он использовался для периодического выполнения кода.

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

void print()
{
  std::cout << "Hello, world!\n";
}

class WorldTimer
{
public:
    boost::posix_time::ptime now()
    {
        return _timer.expires_at();
    }
    void update()
    {
        _f();
        _timer.expires_at(_timer.expires_at() + boost::posix_time::milliseconds(1000));
        _timer.async_wait(boost::bind(&WorldTimer::update, this));
    }
    WorldTimer(boost::asio::io_service& io, void (*f)()) : _f(f), _timer(io){}
private:
    void (*_f)();
    boost::asio::deadline_timer _timer;
};

int main() {
    boost::asio::io_service io;
    WorldTimer timer(io, print);
    timer.update();
    io.run();
    return 0;
}

Программа только выводит Привет, мир! один раз и в ожидании там. У asio doc есть пример , он работает, но я не могу понять, в чем разница.

Да ... таймер не был инициализирован по истечении времени, это исправленная версия:

class WorldTimer
{
public:
    boost::posix_time::ptime now()
    {
        return _timer.expires_at();
    }
    WorldTimer(boost::asio::io_service& io, void (*f)()) : _f(f), _timer(io, boost::posix_time::microseconds(0))
    {
        _timer.async_wait(boost::bind(&WorldTimer::update, this));
    }
private:
    void (*_f)();
    boost::asio::deadline_timer _timer;
    void update()
    {
        _f();
        _timer.expires_at(_timer.expires_at() + boost::posix_time::milliseconds(1000));
        _timer.async_wait(boost::bind(&WorldTimer::update, this));
    }
};

int main() {
    boost::asio::io_service io;
    WorldTimer timer(io, print);
    io.run();
    return 0;
}

1 Ответ

2 голосов
/ 06 декабря 2011

Ваш конструктор таймера крайнего срока отличается от приведенного в примере. Вам нужно явно установить время истечения . В примере кода используется другой конструктор, который устанавливает конкретное время истечения относительно текущего времени .

Таким образом, распечатка, которую вы видите, связана с вашим звонком на update, который вызывает

_timer.expires_at(_timer.expires_at() + boost::posix_time::milliseconds(1000));

и _timer.expires_at() еще не установлены ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...