C++实现的定时器

文章展示了一个使用C++标准库`<chrono>`实现的计时器类`Timer`,它可以测量以毫秒、纳秒等不同时间单位的流逝时间。在测试函数`test1`中,计时器用于计算代码块的执行时间。在`main`函数中,计时器展示了重置功能以及在不同时间单位下测量等待时间的能力。
// #pragma once

#include<chrono>
using namespace std::chrono;

namespace MyTimer
{

class Timer
{
public:
Timer() : m_begin(high_resolution_clock::now()) {}
void reset() {
    m_begin = high_resolution_clock::now();
}

template<typename Duration = milliseconds>
int64_t elapsed() const
{
    return duration_cast<Duration>(high_resolution_clock::now() - m_begin).count();
}
int64_t elapsed_nanos() const
{
    return elapsed<nanoseconds>();
}
int64_t elapsed_micros() const
{
    return elapsed<microseconds>();
}
int64_t elapsed_millis() const
{
    return elapsed<milliseconds>();
}
int64_t elapsed_seconds() const
{
    return elapsed<seconds>();
}
int64_t elapsed_minus() const
{
    return elapsed<minutes>();
}
int64_t elapsed_hours() const
{
    return elapsed<hours>();
}

private:
time_point<high_resolution_clock> m_begin;
};

}


#include<iostream>
#include<thread>

void test1()
{
    ::MyTimer::Timer t;
    int num = 0;
    for (int i = 0; i < 1000; ++i )
    {
        for(int j = 0; j < 100000; ++j) {
            num += (i + j);
        }
    }
    std::cout << t.elapsed() << std::endl;
    std::cout << t.elapsed_nanos() << "ns" << std::endl;
}

int main()
{
    ::MyTimer::Timer t;
    test1();
    std::cout << t.elapsed_nanos() << "ns" << std::endl;


    t.reset();
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cout << t.elapsed_nanos() << "nanos" << std::endl;
    std::cout << t.elapsed_micros() << "micros" << std::endl;
    std::cout << t.elapsed_millis() << "millis" << std::endl;
    return 0;
}
<think>好的,我需要帮助用户了解如何在C++实现定时器功能。首先,我得考虑用户可能的背景。他们可能有一定的C++基础,但不太清楚如何处理定时器。我需要分步骤解释,确保结构清晰。 首先,应该介绍定时器的基本概念,说明其用途,比如执行定期任务或超时处理。接下来,需要考虑不同的实现方法,因为C++标准库中没有直接的定时器类,但可以通过多种方式实现。 然后,可能需要提到不同的平台相关的方法,比如Windows的SetTimer和Linux的定时器函数,但用户可能更倾向于跨平台的解决方案。所以,重点应该放在使用C++11及以后的<chrono>和<thread>库,以及结合事件循环或异步操作的方法。 另外,可能需要展示代码示例,这样用户更容易理解。比如,使用sleep_for的简单定时,但也要指出其阻塞的问题。然后,介绍如何创建非阻塞定时器,使用线程分离或者结合事件循环库如Boost.Asio。 还需要注意代码的正确性和安全性,比如线程管理、资源释放等。同时,提醒用户在实际应用中可能需要处理的问题,比如定时精度、多线程同步等。 最后,总结不同方法的优缺点,帮助用户根据需求选择合适的方式。确保回答结构清晰,逐步引导,并提供可靠的示例代码。</think>在 C++实现定时器功能主要有以下几种实现方式,我将分步骤为您说明: 1. **基础阻塞式定时器** ```cpp #include <chrono> #include <thread> void simple_timer(int milliseconds) { std::this_thread::sleep_for(std::chrono::milliseconds(milliseconds)); // 定时到达后执行的操作 } ``` *缺点*:会阻塞当前线程 2. **非阻塞线程定时器** ```cpp #include <thread> #include <functional> class ThreadTimer { public: void start(int interval, std::function<void()> task) { m_thread = std::thread([=] { while (!m_stop) { std::this_thread::sleep_for( std::chrono::milliseconds(interval)); task(); } }); } void stop() { m_stop = true; if (m_thread.joinable()) m_thread.join(); } private: std::thread m_thread; bool m_stop = false; }; ``` 3. **使用 STL + chrono(C++11+)** ```cpp #include <chrono> #include <future> void async_timer(int delay_ms, std::function<void()> callback) { std::async(std::launch::async, [=]() { std::this_thread::sleep_for( std::chrono::milliseconds(delay_ms)); callback(); }); } ``` 4. **高性能定时器方案(推荐使用事件循环库)** ```cpp // 使用 Boost.Asio 示例 #include <boost/asio.hpp> class AsioTimer { public: AsioTimer() : m_io(), m_timer(m_io) {} void start(int milliseconds, std::function<void()> task) { m_timer.expires_after( std::chrono::milliseconds(milliseconds)); m_timer.async_wait([task](const boost::system::error_code&) { task(); }); m_thread = std::thread([this]{ m_io.run(); }); } void stop() { m_io.stop(); if (m_thread.joinable()) m_thread.join(); } private: boost::asio::io_context m_io; boost::asio::steady_timer m_timer; std::thread m_thread; }; ``` **实现要点分析**: 1. 精度选择:根据需求选择毫秒/微秒级精度 2. 线程安全:多线程环境下需要同步机制 3. 资源释放:注意线程的及时回收 4. 定时模式:单次触发 vs 周期触发 5. 事件驱动:推荐集成到事件循环中 **推荐方案选择**: - 简单需求:使用 `std::async` 异步定时器 - 高频触发:选择 Boost.Asio 定时器 - 跨平台需求:优先使用标准库方案 - 精确控制:需要结合系统API(如 Linux 的 timerfd) **定时器设计建议**: 1. 使用唯一ID标识定时器 2. 实现取消定时器接口 3. 添加异常处理机制 4. 考虑时间补偿(防止任务堆积) 5. 支持多种时间单位(秒/毫秒/微秒) 实际项目中建议使用成熟的库(如 libevent、Boost.Asio 等),这些库已经处理了跨平台差异和性能优化问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值