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

Timer.2 - Using a timer asynchronously

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

Эта учебная программа демонстрирует, как использовать асинхронную функцию обратного вызова 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& /*e*/)
{
  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 - Обязательные аргументы для обработчика


PrevUpHomeNext

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




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 01:19:37/0.0053830146789551/1