一个封装好的定时器类
支持添加和删除多个回调函数
代码如下:
/**
计时器类
*/
#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__