c++ 定时器类

一个封装好的定时器类
支持添加和删除多个回调函数

代码如下:

/**
计时器类
 */

#ifndef __TTIMER_H__
#define __TTIMER_H__

#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>
#include <condition_variable>
#include <functional>

using TimerCallFunc = std::function<int(void*)>;
class TTimer
{
public:
    TTimer(int time = 10):m_time(time) // time单位为毫秒
    {

    }
    virtual ~TTimer(){}
    
    void Start() {
        if (m_isRuning){
            return;
        }
        m_isRuning = true;
        
        std::thread([this](){
            while (!m_isStoping){
                std::this_thread::sleep_for(std::chrono::milliseconds(m_time));
                std::lock_guard<std::mutex> locker(m_mtxRun);
                for (size_t i = 0; i < m_vecCallFunc.size(); i++)
                {
                    m_vecCallFunc[i](nullptr);
                }
            }
            {
                std::lock_guard<std::mutex> locker(m_mtx);
                m_isRuning = false;
                m_cond.notify_one();
            }
        }).detach();
    }
    void Stop(){
		// do not stop again
		if (!m_isRuning)
			return;

		if (m_isStoping)
			return;

		m_isStoping = true;
		{
			std::unique_lock<std::mutex> locker(m_mtx);
			m_cond.wait(locker, [this] {return m_isRuning == true; });

			// reset the timer
			if (m_isRuning == false)
				m_isStoping = false;
		}
    }
    int AddCallFunc(TimerCallFunc callfunc){
        std::lock_guard<std::mutex> locker(m_mtxRun);
        m_vecCallFunc.push_back(callfunc);
        int callfunid = m_vecCallFunc.size();
        return callfunid;
    }
    int RemoveCallFunc(int callfunid){
        std::lock_guard<std::mutex> locker(m_mtxRun);
        if (callfunid <= (int)m_vecCallFunc.size())
        {
            m_vecCallFunc.erase(m_vecCallFunc.begin()+(callfunid-1));
        }
        
        return 0;
    }
private:
    bool m_isRuning = false;
    bool m_isStoping = false; 
    std::mutex m_mtx;
    std::mutex m_mtxRun;//用于保证在多线程环境下对同一个ttimer进行添加和删除回调函数时线程安全
    std::condition_variable m_cond;
    int m_time;
    std::vector<TimerCallFunc> m_vecCallFunc;
};




#endif //__TTIMER_H__
在Linux下使用C++实现定时器的方法有很多种。根据引用\[1\]中的描述,你可以自己编写一个定时器来实现你的需求。下面是一个示例代码,你可以参考一下: ```cpp #include <iostream> #include <chrono> #include "timer.h" using namespace std; auto startTime = std::chrono::high_resolution_clock::now(); void timeout_callback(void){ auto endTime = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::high_resolution_clock::now() - startTime).count(); auto timeuse = endTime * 0.001; printf("Time elapsed %f ms\n", timeuse); exit(0); } int main() { timer t; t.timer_add(1, timeout_callback); startTime = std::chrono::high_resolution_clock::now(); getchar(); return 0; } ``` 在这个示例代码中,我们使用了`timer`来实现定时器功能。你可以在`timer.h`文件中定义这个,具体的实现可以参考引用\[3\]中的代码。在`main`函数中,我们创建了一个`timer`对象,并使用`timer_add`方法来添加一个定时任务,指定了定时的时间间隔和回调函数。当定时器触发时,会执行回调函数`timeout_callback`,并计算时间差。 希望这个示例代码能够帮助到你实现Linux下的C++定时器。如果你有其他问题,请随时提问。 #### 引用[.reference_title] - *1* *3* [Linux下C++定时器Timer](https://blog.csdn.net/weixin_44001652/article/details/119025905)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [定时器-C++ Linux](https://blog.csdn.net/weixin_44881106/article/details/127240731)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值