boost.asio框架系列之定时器Timer

2022-06-18 17:53:41

同步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!\n";

        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!\n";
    }
    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\n";
                  return;
              }
      
              std::cout << "Hello, world!\n";
          }
      
          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!\n";
          }
      
          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;
          }

      到此这篇关于boost.asio框架系列之定时器Timer的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持易采站长站。