• 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;
        }


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


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


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


    调用timer的cancel函数取消timer
    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文档的原始示例。
  • 相关阅读:
    python没有switch,可以用字典来替代
    Django1.8:403错误:CSRF verification failed. Request aborted.
    django重定向
    第九章 JSP标签——《跟我学Shiro》
    第八章 拦截器机制——《跟我学Shiro》
    第七章 与Web集成——《跟我学Shiro》
    第六章 Realm及相关对象——《跟我学Shiro》
    第五章 编码/加密——《跟我学Shiro》
    第四章 INI配置——《跟我学Shiro》
    第三章 授权——《跟我学Shiro》
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318400.html
Copyright © 2020-2023  润新知