ASIO的定时器

简介: ASIO的定时器

ASIO的定时器

ASIO现在提供的定时器有以下几种:

boost::asio::deadline_timer
boost::asio::steady_timer
boost::asio::high_resolution_timer
boost::asio::system_timer

high_resolution_timer就是system_timer,也是精度最高的定时器,精度为:纳秒。

steady_timersystem_timer都是模板basic_waitable_timer<>的特例化:

typedef basic_waitable_timer<chrono::system_clock> system_timer;
typedef basic_waitable_timer<chrono::steady_clock> steady_timer;

deadline_timerbasic_deadline_timer<>的特例化,它使用的计量时间是系统时间,修改系统时间会对它造成影响:

typedef basic_deadline_timer<boost::posix_time::ptime> deadline_timer;

下面是一个完整的定时器应用示例:

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

namespace asio = boost::asio;
using error_code = boost::system::error_code;

auto now()
{
    return std::chrono::high_resolution_clock::now();
}

void async_wait(asio::high_resolution_timer& timer, std::chrono::high_resolution_clock::time_point& lastTime)
{
    timer.expires_after(std::chrono::seconds(1));

    timer.async_wait([&](error_code ec)
    {
        if (ec == asio::error::operation_aborted)
        {
            return;
        }
        auto elapsed = std::chrono::duration_cast<std::chrono::seconds>(now() - lastTime).count();
        lastTime = now();
        std::cout << elapsed << "\n";
        async_wait(timer, lastTime);
    });
}

int main()
{
    asio::io_context ctx;

    asio::high_resolution_timer timer(ctx);
    auto lastTime = now();

    async_wait(timer, lastTime);

    ctx.run();
}

定时器的到期时间可以用持续时间:

timer.expires_after(std::chrono::seconds(1));

也可以用绝对时间去定时:

timer.expires_at(std::chrono::high_resolution_clock::now() + std::chrono::seconds(1));

如果要获取到期的绝对时间值,可以调用expiry()成员方法:

std::chrono::high_resolution_clock::time_point time_point = timer.expiry();

如果要取消当前定时器,可以调用cancel成员方法,它将触发一个错误码为boost::asio::error::operation_aborted的回调:

timer.async_wait([&] (error_code error)
{
    if(error == boost::asio::error::operation_aborted)
    {
        std::cout << "The timer is cancelled\n";
    }
});


timer.cancel();
目录
相关文章
|
4月前
STM32Cubmx FreeRTOS Timer
STM32Cubmx FreeRTOS Timer
49 10
|
4月前
|
测试技术 PHP
Swoole 源码分析之 Timer 定时器模块
Swoole 中的毫秒精度的定时器。底层基于 `epoll_wait` 和 `setitimer` 实现,数据结构使用最小堆,可支持添加大量定时器。
78 0
Swoole 源码分析之 Timer 定时器模块
|
6月前
|
缓存
muduo源码剖析之Timer定时器
Timer 类是 muduo 网络库中的一个定时器类,用于在指定的时间间隔后执行某个任务。Timer 类提供了一系列的方法来创建、启动、停止和删除定时器,以及设置定时器的时间间隔和回调函数等。在 muduo 网络库中,Timer 类被广泛应用于各种网络任务中,例如定期发送心跳包、更新缓存、清理资源等。通过使用 Timer 类,我们可以方便地实现定时任务,提高网络应用程序的可靠性和稳定性。:启动定时器,在指定的时间间隔后调用回调函数。:停止定时器,不再执行定时任务。
113 0
|
6月前
|
Java
【Java多线程】定时器Timer
【Java多线程】定时器Timer
52 0
【Java多线程】定时器Timer
|
Linux
settime计时器和POSIX timer函数
settime计时器和POSIX timer函数
200 0
|
Linux C++ Windows
基于Asio库的定时器,封装实现好用的定时任务
基于Asio库的定时器,封装实现好用的定时任务
|
Java 测试技术
在多线程中自定义实现定时器(Timer)
在多线程中自定义实现定时器(Timer)
Qt | 定时器的使用 QTimer
学习使用Qt定时器的用法。
958 0
2.6.4 Qtimer定时器介绍
2.6.4 Qtimer定时器介绍
128 0
2.6.4 Qtimer定时器介绍
|
API 调度 Android开发
【Android 异步操作】Timer 定时器 ( Timer 与 TimerTask 基本使用 | Timer 定时器常用用法 | Timer 源码分析 )
【Android 异步操作】Timer 定时器 ( Timer 与 TimerTask 基本使用 | Timer 定时器常用用法 | Timer 源码分析 )
909 0