时间轮法设计的定时器

本文介绍了一种基于时间轮设计的定时器实现,通过ATimer、BTimer和CTimer三个示例,展示了如何使用C++和ztimer库创建不同类型的定时任务,包括循环定时、一次性定时和绝对定时。核心是通过Tick线程控制时间轮,触发定时器超时操作。
摘要由CSDN通过智能技术生成

采用时间轮法设计的定时器;

首先Tick线程产生时钟滴答信号,定时转动时间轮,时间轮的刻度针指向某刻度时,挂载在上面的定时器计数减一,当计数为0时,异步执行超时函数。

在本项目中,使用数组作为时间轮构造的数据结构,映射作为定时器存储的数据结构,以定时器对象的指针作为关键索引。使用构造一个定时器很简单,只需要继承Timer类即可。通过Start函数可以构造循环定时器(LOOP)一次性定时器(ONCE)以及绝对定时器

#include <iostream>
#include <thread>
#include <chrono>
#include "ztimer/Timer.h"
using namespace ztimer;
class ATimer : public ztimer::Timer {
public:
    ATimer() {}
    ~ATimer() {}
    void TimeOut() { std::cerr << "a timeout" << std::endl; }

private:
};

class BTimer : public ztimer::Timer {
public:
    BTimer() {}
    ~BTimer() {}
    void TimeOut() { std::cerr << "b timeout" << std::endl; }

private:
};

class CTimer : public ztimer::Timer {
public:
    CTimer() {}
    ~CTimer() {}
    void TimeOut() { std::cerr << "c timeout" << std::endl; }

private:
};

int main(int argc, char** argv)
{
    ATimer a;
    a.Start(ztimer::ONCE, 0.8_s);
    BTimer b;
    b.Start(ztimer::ONCE, 2.5_s);
    CTimer c;
    c.Start("2020-11-23 22:35:00"); // 绝对定时器,基于过去时间无法成功注册定时器
    std::thread t([]() {
        while (1) {
            std::this_thread::sleep_for(std::chrono::seconds(2));
        }
    });
    t.join();
    return 0;
}

在本项目中影响定时器的主要因素是产生滴答信号的精度。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sh0jU1Bi-1606142661266)(https://raw.githubusercontent.com/AZMDDY/imgs/master/20201115121300.png)]

编译

mkdir build && cd build
cmake ..
make
make install

示例

# 项目的根目录ROOT_DIR
cd ${ROOT_DIR}
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=${ROOT_DIR}/examples ..
make
make install

cd examples
mkdir build && cd build
cmake ..
make
./example_ztimer

https://github.com/AZMDDY/ztimer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值