Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Timer.4 - Using a member function as a handler

Boost , Boost.Asio , Tutorial

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

В этом уроке мы увидим, как использовать функцию члена класса в качестве обработчика обратного вызова. Программа должна выполняться идентично обучающей программе из учебника 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 - Синхронизация обработчиков в многопоточных программах


PrevUpHomeNext

Статья Timer.4 - Using a member function as a handler раздела Boost.Asio Tutorial может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Tutorial ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 22:55:43/0.028301000595093/1