В этом уроке мы увидим, как использовать функцию члена класса в качестве обработчика обратного вызова. Программа должна выполняться идентично обучающей программе из учебника Timer.3.
#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
Вместо определения свободной функциипечати
в качестве обработчика обратного вызова, как мы делали в более ранних учебных программах, мы теперь определяем класс, называемыйпринтер
.
class printer
{
public:
Конструктор этого класса будет ссылаться на объект io_service и использовать его при инициализации элементатаймера
. Счетчик, используемый для закрытия программы, теперь также является членом класса.
printer(boost::asio::io_service& io)
: timer_(io, boost::posix_time::seconds(1)),
count_(0)
{
Функция boost::bind() работает так же хорошо с функциями членов класса, как и со свободными функциями. Поскольку все нестатические функции членов класса имеют неявныйэтот
параметр, мы должны связатьэтот
с функцией. Как и в учебнике Timer.3, boost::bind() преобразует наш обработчик обратного вызова (теперь функция участника) в объект функции, который можно вызвать, как если бы он имел сигнатуруvoidconstboost::система::error_code&]
.
Вы заметите, что усилитель::asio::placeholders::error placeholder не указан здесь, так как функция печати
не принимает объект ошибки в качестве параметра.
timer_.async_wait(boost::bind(&printer::print, this));
}
В классе деструктора мы распечатаем конечное значение счетчика.
~printer()
{
std::cout << "Final count is " << count_ << std::endl;
}
Функцияпечати
очень похожа на функциюпечати
из учебника Timer.3, за исключением того, что теперь она работает на элементах данных класса вместо того, чтобы передавать таймер и счетчик в качестве параметров.
void print()
{
if (count_ < 5)
{
std::cout << count_ << std::endl;
++count_;
timer_.expires_at(timer_.expires_at() + boost::posix_time::seconds(1));
timer_.async_wait(boost::bind(&printer::print, this));
}
}
private:
boost::asio::deadline_timer timer_;
int count_;
};
Основная функция
намного проще, чем раньше, так как она теперь объявляет локальныйпринтер
объектом перед запуском io_service как обычно.
int main()
{
boost::asio::io_service io;
printer p(io);
io.run();
return 0;
}
Полный список источников
Вернуться вучебный индекс
Предыдущая статья:Таймер.3 — Обязательные аргументы для обработчика
Timer.5 - Синхронизация обработчиков в многопоточных программах