服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - boost.asio框架系列之定时器Timer

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

2022-12-29 14:03天方 C/C++

这篇文章介绍了boost.asio框架系列之定时器Timer,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

同步Timer

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
#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比较简单,示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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可以感知到计时器是否已经被取消

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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的超时时间,如下示例就通过它实现一个周期计时器。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.cnblogs.com/TianFang/archive/2013/02/02/2890325.html

延伸 · 阅读

精彩推荐
  • C/C++C++中图片重命名实现代码

    C++中图片重命名实现代码

    这篇文章主要介绍了C++中图片重命名实现代码,需要的朋友可以参考下...

    C++教程网10192021-05-12
  • C/C++C++ 编写DLL文件给易语言调用方法

    C++ 编写DLL文件给易语言调用方法

    在本文中我们给大家分享了C++ 编写DLL文件给易语言调用的代码和方法,需要的朋友们学习下。...

    C++教程网5252021-07-16
  • C/C++C++设计模式之享元模式(Flyweight)

    C++设计模式之享元模式(Flyweight)

    这篇文章主要为大家详细介绍了C++设计模式之享元模式Flyweight,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    chencarl11222021-06-23
  • C/C++深入解析C++中的构造函数和析构函数

    深入解析C++中的构造函数和析构函数

    析构函数:在撤销对象占用的内存之前,进行一些操作的函数。析构函数不能被重载,只能有一个...

    C++教程网2052020-12-24
  • C/C++C++函数指针详解

    C++函数指针详解

    这篇文章主要介绍了C++函数指针详解,通过文字描述C++函数指针基础概念,内涵详细的代码实现和解析,希望对你能够有所帮助...

    途径北海道7492021-11-18
  • C/C++C语言示例讲解do while循环语句的用法

    C语言示例讲解do while循环语句的用法

    在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。一组被重复执行的语句称之为循环体,能否继续重复,决定循环...

    要努力丫!3502022-12-22
  • C/C++C++实现简单学生成绩管理系统

    C++实现简单学生成绩管理系统

    这篇文章主要为大家详细介绍了C++实现简单学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    陆鳴笙10662022-10-24
  • C/C++Linux系统下如何使用C++解析json文件详解

    Linux系统下如何使用C++解析json文件详解

    JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。下面这篇文章主要给大家介绍了关于Linux系统下如何使用C++解析json文件的相关资料,需...

    Overboom6232021-11-11