Мой первый пост я хотел бы посвятить переводу web-учебника по Boost.Asio. Оригинал материала доступен здесь.

Тем, кто не знает, что такое Boost.Asio, посвящается. Boost.Asio — это кросс-платформенная библиотека С++ для сетевого и низкоуровневого ввода-вывода программирования, которая предоставляет разработчикам, использующим асинхронную модель, современный подход программирования на С++. В нашем случае это будет С++11.

Версия Boost, которую я использую — Boost Version 1.60.0. Скачать можно тут.

Опираясь на свой опыт, хотелось бы сразу решить вопрос с установкой библиотеки. Я использую MVS 15, следовательно ставить Boost мы будем туда.

Установка библиотеки


  • После скачивания архива с библиотекой, распаковываем его на Локальный диск (лучше) С.
  • Открываем папку boost_1_60_0 и запускаем файл bootstrap.bat
  • После того как bootstrap.bat отработает, в папке появится файл b2.exe
  • Запускаем b2.exe и ждем от 5 минут до 1,5 часа (зависит от «машины»)
  • Когда b2.exe отработает, ваша библиотека будет в собранном состоянии, осталось только её подключить в нашу IDE.
  • Запускаем MVS, в вкладке «Вид» находим Property Manager
  • Двойным кликом открываем страницу свойств папки Debug | Win32 и кликаем на VC++ Directories
  • В колонке Include Directories выбираем изменить, далее нажимаем на «папку со *» New Line и указываем ей путь к папке boost_1_60_0, жмём ОК.
  • Проводим аналогию с некоторыми изменениями для колонки Library Directoties, но для неё указываем путь C:\boost_1_60_0\stage\lib, жмём ОК.
  • Библиотека подключена!

Можем приступать!

Basic Skills


Первые пять уроков, или как они называются в учебнике Timer, будут вводными в фундаментальные понятия, необходимые для использования инструмента Asio. Перед тем, как погрузиться в сложный мир сетевого программирования, эти Timers (уроки) иллюстрируют базовые навыки, используя простые асинхронные таймеры.

Урок 1. — Использование синхронного таймера. "Timer.1 — Using a timer synchronously"

Этот урок вводит нас в Asio, показывая, как выполняется ожидание по таймеру. Начнём мы с подключения заголовочных файлов. Все Asio классы представлены в виде файлов с расширением Asio.hpp.

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

Так как в этом примере мы используем таймеры, то мы должны включить соответствующий файл заголовка Boost.Date_Time.

#include <boost/date_time/posix_time/posix_time.hpp>

Все программы, которые используют Asio, должны иметь, по крайней мере, один объект io_service. Этот класс обеспечивает доступ к функциям ввода / вывода. Мы объявляем объект этого типа первым делом в главной функции. Но перед этим я хотел бы немного облегчить написание нашего кода, при помощи пространства имени. После всех подключенных ЗФ, пишем:

using namespace std;
using namespace boost::asio;

Думаю тут особо вопросов не должно возникнуть.

int main()
{
	io_service io;

Далее мы объявляем объект типа deadline_timer. Основные классы Asio, которые обеспечивают функции ввода/вывода (или как в данном случае функциональность нашего Таймера) всегда берут ссылку на io_service в качестве первого аргумента конструктора. Второй аргумент конструктора установка таймера 5 секунд.

deadline_timer t(io, boost::posix_time::seconds(5));

В этом простом примере мы выполняем блокирующие ожидание по таймеру. То есть, вызов deadline_timer :: wait () не вернется, пока таймер не отсчитает 5 секунд после того, как он был создан. Deadline timer, всегда находится в одном из двух состояний: «истек»(expired)или «не истек»(not expired). Если deadline_timer::wait() функция принимает аргумент expired, то функция сразу же вернёт значение.

t.wait();

Наконец мы выводим всеми любимый и знакомый «Hello, World!» сообщение, чтобы показать, когда таймер истек «expired».

  cout << "Hello, world!" << endl;
  _getwch(); //Напиши, чтобы поставить программу в режим ожидания и запечатлеть приветствие! 
  return 0;
}

Полный код программы в оригинале:

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

int main()
{
  boost::asio::io_service io;

  boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
  t.wait();

  std::cout << "Hello, world!" << std::endl;

  return 0;
}

Полный код программы в личном варианте:

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

using namespace std;
using namespace boost::asio;

int main()
{
	io_service io;

	deadline_timer t(io, boost::posix_time::seconds(5));
	t.wait();

	cout << "Hello, world!" << endl;

	return 0;
}

На этом наш первый урок заканчивается. Спасибо за внимание.