boost.asio系列——Timer


同步Timer

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

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

intmain()
{
boost::asio::io_serviceio;
boost::asio::deadline_timertimer(io, boost::posix_time::seconds(3));

timer.wait();
std::cout <<"Hello, world!\n";

return0;
}

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

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

异步Timer

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

voidprint(constboost::system::error_code&/*e*/)
{
std::cout <<"Hello, world!\n";
}
intmain()
{
boost::asio::io_serviceio;
boost::asio::deadline_timertimer(io, boost::posix_time::seconds(5));

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

return0;
}

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

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

取消Timer

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

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

voidprint(constboost::system::error_code&err)
{
if(err)
{
std::cout <<"timer is canceled\n";
return;
}

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

intmain()
{
boost::asio::io_serviceio;

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

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

io.run();
return0;
}

更改Timer超时时间

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

typedefstd::function<void(constboost::system::error_code&)>timer_callback;
voidprint(constboost::system::error_code&)
{
std::cout <<"Hello, world!\n";
}

intmain()
{
boost::asio::io_serviceio;
boost::asio::deadline_timertimer(io, boost::posix_time::seconds(1));

timer_callbackcallback = [&](constboost::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();
return0;
}

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

优质内容筛选与推荐>>
1、python class
2、设置状态栏、导航栏颜色
3、Web Developer教程
4、获取表的记录总数
5、centos7 将服务添加到systemctl


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号