c/c++语言开发共享boost.asio框架系列之定时器Timer

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


同步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 canceledn";              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的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持<计算机技术网(www.ctvol.com)!!>。

需要了解更多c/c++开发分享boost.asio框架系列之定时器Timer,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/1237760.html

(0)
上一篇 2022年9月10日
下一篇 2022年9月10日

精彩推荐