Эта учебная программа демонстрирует, как использовать асинхронную функцию обратного вызова Asio, изменяя программу из учебного пособия Timer.1 для выполнения асинхронного ожидания на таймере.
#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
Использование асинхронной функциональности Asio означает наличие функции обратного вызова, которая будет вызываться при завершении асинхронной операции. В этой программе мы определяем функцию под названием print
, которая должна быть вызвана, когда асинхронное ожидание заканчивается.
void print(const boost::system::error_code& )
{
std::cout << "Hello, world!" << std::endl;
}
int main()
{
boost::asio::io_service io;
boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
Далее, вместо того, чтобы выполнять блокирующее ожидание, как в учебнике Timer.1, мы называем функцию deadline_timer::async_wait() для выполнения асинхронного ожидания. При вызове этой функции мы передаем обработчик обратного вызова print
, который был определен выше.
t.async_wait(&print);
Наконец, мы должны вызвать функцию io_service::run() на объекте io_service.
Библиотека Asio гарантирует, что обработчики обратного вызова будут вызываться только из потоков, которые в настоящее время вызывают io_service::run(). Поэтому, если функция io_service::run() не называется обратным вызовом для асинхронного завершения ожидания, она никогда не будет задействована.
Функция io_service::run() также будет продолжать работать, пока еще есть «работа». В этом примере работа представляет собой асинхронное ожидание на таймере, поэтому вызов не вернется, пока таймер не истечет и обратный вызов не будет завершен.
Важно помнить, что io_service должен выполнять некоторую работу перед вызовом io_service::run(). Например, если бы мы пропустили вышеупомянутый вызов на deadline_timer::async_wait(), у io_service не было бы работы, и, следовательно, io_service::run() немедленно вернулся бы.
io.run();
return 0;
}
См. полный список источников
Вернуться в tutorial index
Timer.1 - Использование таймера синхронно
Timer.3 - Обязательные аргументы для обработчика