c++

定时器

c++

Posted by YiMiTuMi on April 15, 2026

定时器

项目中使用了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);

}