Мой первый пост я хотел бы посвятить переводу web-учебника по Boost.Asio. Оригинал материала доступен здесь.
Тем, кто не знает, что такое Boost.Asio, посвящается. Boost.Asio — это кросс-платформенная библиотека С++ для сетевого и низкоуровневого ввода-вывода программирования, которая предоставляет разработчикам, использующим асинхронную модель, современный подход программирования на С++. В нашем случае это будет С++11.
Версия Boost, которую я использую — Boost Version 1.60.0. Скачать можно тут.
Опираясь на свой опыт, хотелось бы сразу решить вопрос с установкой библиотеки. Я использую MVS 15, следовательно ставить Boost мы будем туда.
Можем приступать!
Первые пять уроков, или как они называются в учебнике Timer, будут вводными в фундаментальные понятия, необходимые для использования инструмента Asio. Перед тем, как погрузиться в сложный мир сетевого программирования, эти Timers (уроки) иллюстрируют базовые навыки, используя простые асинхронные таймеры.
Урок 1. — Использование синхронного таймера. "Timer.1 — Using a timer synchronously"
Этот урок вводит нас в Asio, показывая, как выполняется ожидание по таймеру. Начнём мы с подключения заголовочных файлов. Все Asio классы представлены в виде файлов с расширением Asio.hpp.
Так как в этом примере мы используем таймеры, то мы должны включить соответствующий файл заголовка Boost.Date_Time.
Все программы, которые используют Asio, должны иметь, по крайней мере, один объект io_service. Этот класс обеспечивает доступ к функциям ввода / вывода. Мы объявляем объект этого типа первым делом в главной функции. Но перед этим я хотел бы немного облегчить написание нашего кода, при помощи пространства имени. После всех подключенных ЗФ, пишем:
Думаю тут особо вопросов не должно возникнуть.
Далее мы объявляем объект типа deadline_timer. Основные классы Asio, которые обеспечивают функции ввода/вывода (или как в данном случае функциональность нашего Таймера) всегда берут ссылку на io_service в качестве первого аргумента конструктора. Второй аргумент конструктора установка таймера 5 секунд.
В этом простом примере мы выполняем блокирующие ожидание по таймеру. То есть, вызов deadline_timer :: wait () не вернется, пока таймер не отсчитает 5 секунд после того, как он был создан. Deadline timer, всегда находится в одном из двух состояний: «истек»(expired)или «не истек»(not expired). Если deadline_timer::wait() функция принимает аргумент expired, то функция сразу же вернёт значение.
Наконец мы выводим всеми любимый и знакомый «Hello, World!» сообщение, чтобы показать, когда таймер истек «expired».
Полный код программы в оригинале:
Полный код программы в личном варианте:
На этом наш первый урок заканчивается. Спасибо за внимание.
Тем, кто не знает, что такое 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;
}
На этом наш первый урок заканчивается. Спасибо за внимание.