zoukankan      html  css  js  c++  java
  • boost.asio系列——Timer

    同步Timer

    asio中提供的timer名为deadline_timer,它提供了超时计时的功能。首先以一个最简单的同步Timer为例来演示如何使用它。

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

        int main()
        {
            boost::asio::io_service io;
            boost::asio::deadline_timer timer(io, boost::posix_time::seconds(3));
        
            timer.wait();
            std::cout << "Hello, world! ";

            return 0;
        }

    首先常见了一个io_service对象,它提供了IO调度功能,asio库中的所有io操作都是基于它来执行的。然后创建了一个deadline_timer对象,它有两个参数,一个是io_service对象,另一个是超时时间。

    创建了timer后,就可以调用wait函数来阻塞等待至timer超时了,它还有一种可以指定错误码的入参的重载形式,关于错误码后面再介绍。

    异步Timer

    同步timer虽然简单,但由于其会阻塞,在实际的项目中并不常用,而往往使用的是异步timer:指定一个回调函数,计时器超时后执行回调函数。asio中实现异步timer比较简单,示例如下:

        void print(const boost::system::error_code& /*e*/)
        {
            std::cout << "Hello, world! ";
        }
        int main()
        {
            boost::asio::io_service io;
            boost::asio::deadline_timer timer(io, boost::posix_time::seconds(5));

            timer.async_wait(&print);
            io.run();

            return 0;
        }

    和同步方式相比,它主要有两点不同:

    1. 调用的是非阻塞函数async_wait,它的入参是一个回调函数。
    2. 显式调用io_service.run()函数驱动异步IO调度。

    取消Timer

    Timer还有一种常用操作是取消Timer,基本方法如下:

    1. 调用timer的cancel函数取消timer
    2. timer取消后,回调函数会立即执行,通过err_code可以感知到计时器是否已经被取消

        void print(const boost::system::error_code& err)
        {
            if(err)
            {
                std::cout << "timer is canceled ";
                return;
            }

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

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

            boost::asio::deadline_timer timer(io, boost::posix_time::seconds(5));
            timer.async_wait(&print);

            boost::asio::deadline_timer timer2(io, boost::posix_time::seconds(2));
            timer2.wait();
            timer.cancel();

            io.run();
            return 0;
        }

    更改Timer超时时间

    可以通过expires_from_now和expires_at两个函数更改Timer的超时时间,如下示例就通过它实现一个周期计时器。

        typedef std::function<void (const boost::system::error_code&)> timer_callback ;
        void print(const boost::system::error_code&)
        {
            std::cout << "Hello, world! ";
        }

        int main()
        {
            boost::asio::io_service io;
            boost::asio::deadline_timer timer(io, boost::posix_time::seconds(1));

            timer_callback callback = [&](const boost::system::error_code& err) 
            {
                print(err);
                timer.expires_at(timer.expires_at() + boost::posix_time::seconds(1));
                timer.async_wait(callback);
            };

            timer.async_wait(callback);
            io.run();
            return 0;
        }

    PS:为了简单,这儿用到了c++11的语法,不想用c++11语法可以参考boost文档的原始示例

  • 相关阅读:
    hdu5728 PowMod
    CF1156E Special Segments of Permutation
    CF1182E Product Oriented Recurrence
    CF1082E Increasing Frequency
    CF623B Array GCD
    CF1168B Good Triple
    CF1175E Minimal Segment Cover
    php 正则
    windows 下安装composer
    windows apache "The requested operation has failed" 启动失败
  • 原文地址:https://www.cnblogs.com/lidabo/p/3790560.html
Copyright © 2011-2022 走看看