定时器
项目中使用了QT的定时器,但是不使用QT的主函数,QT定时器是无法触发的。
PreciseTimer.h
#ifndef PRECISE_TIME_H
#define PRECISE_TIME_H
#include <chrono>
#include <thread>
#include <functional>
#include <atomic>
class PreciseTime
{
public:
//启动 毫秒
void Start(std::function<void()> func, int interval = 1000);
//暂停
void Pause();
//停止
void Stop();
//继续
void Continue();
//获取当前定时器状态
int GetState();
//设置步长
void SetStep(int iStep);
private:
std::atomic<int> running{ 0 }; //0 停止 1 开始 2暂停
std::thread timer_thread;
int m_interval;
public:
PreciseTime();
~PreciseTime();
};
#endif
PreciseTimer.cpp
#include "PreciseTime.h"
PreciseTime::PreciseTime()
{
m_interval = 1000;
}
PreciseTime::~PreciseTime()
{
Stop();
}
//启动
void PreciseTime::Start(std::function<void()> func, int interval /*= 1000*/)
{
running = 1;
m_interval = interval;
timer_thread = std::thread([this, func]()
{
while (running != 0)
{
//休眠
std::this_thread::sleep_for(std::chrono::milliseconds(m_interval));
if (running != 2)
{
func(); //暂停就不用掉了
}
}
});
}
//暂停
void PreciseTime::Pause()
{
running = 2;
}
//停止
void PreciseTime::Stop()
{
running = 0;
if (timer_thread.joinable())
{
timer_thread.join();
}
}
//继续
void PreciseTime::Continue()
{
running = 1;
}
//获取当前定时器状态
int PreciseTime::GetState()
{
return m_interval;
}
//设置步长
void PreciseTime::SetStep(int iStep)
{
m_interval = iStep;
}
定时器用法
void ThreadTime()
{
}
int main()
{
PreciseTime* pTime = new PreciseTime;
//普通函数
pTime->Start(ThreadTime, 1000);
//类成员函数, 接受一个类的this
pTime->Start(std::bind(&xxxx::ThreadTime, this), 1000);
}