boost asio deadline_timer

Я ожидал, что приведенный ниже код напечатает Hello, world! каждые 5 секунд, но происходит то, что программа делает паузу на 5 секунд, а затем печатает сообщение снова и снова без последующих пауз. Чего мне не хватает?

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

изменить, чтобы добавить рабочий код ниже. спасибо, ребята.

#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;
}
11
задан Sam Miller 21 March 2013 в 03:22
поделиться

2 ответа

Вы создаете deadline_timer как локальную переменную, а затем сразу выходите из функции. Это заставляет таймер разрушаться и отменять себя и вызывает вашу функцию с кодом ошибки, который вы игнорируете, вызывая бесконечный цикл.

Использование одного объекта таймера, хранящегося в члене или глобальной переменной, должно исправить это.

26
ответ дан 3 December 2019 в 02:51
поделиться

Если вы посмотрите на код ошибки, вы получите сообщение об ошибке отмены операции.

2
ответ дан 3 December 2019 в 02:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: