QT:定时任务

目录

学习目标

学习内容

方法一

方法二(实际使用多一些)


学习目标

在QT中设置定时任务

例如:

  • 每十秒检测一次电池

学习内容

QTimer定时器使用

方法一参考:(31条消息) QT定时任务- timerEvent事件使用以及和QTimer 定时器的使用区别_qt 定时任务_温柔大猩猩的博客-CSDN博客


方法一

所有继承自QObject的类,都会有一个timerEvent(QTimerEvent *event)的纯虚函数,我们只需要继承QObject,然后再重载这个函数以实现自己的定时功能。

在.h文件中定义定时器ID

class BatteryCell : public QWidget
{
    Q_OBJECT

public:
    explicit BatteryCell(QWidget *parent = nullptr);
    ~BatteryCell();
    int timerID;
    void Delay_MSec(unsigned int msec);
    void init();//初始化函数
private:
    QTime chargingTimer;
    void timerEvent(QTimerEvent *event);
};

在.cpp文件中重载timerEvent(),使用startTimer(timerId)开启定时器,使用killTimer(timerId)关闭定时器。逻辑里通过验证timeID实现不同功能:

void BatteryCell::init()
{
    chargingTimer.start();
    timerID=startTimer(10000);//定时任务,每隔10秒检查一次电池是否充电
}

void BatteryCell::timerEvent(QTimerEvent *event)
{
    int tmp=event->timerId();
    if(tmp == timerID) {
        Delay_MSec(5000);
    }
}

void BatteryCell::Delay_MSec(unsigned int msec)
{
    QTime _Timer = QTime::currentTime().addMSecs(msec); // 在当前的时间上增加多少秒
    
    /*...
        检查电池需要执行的操作
    ...*/

    while( QTime::currentTime() < _Timer ) // while循环
        QCoreApplication::processEvents(QEventLoop::AllEvents, 100);// 期间在做主事件循环,就避免了阻塞//去掉这句就是阻塞延时了
}

Delay_MSec(INT msec)实现了QT中的非阻塞延时,非常好用,适合在对象内部自延时而不卡住其他事件(如界面事件)。


方法二(实际使用多一些)

在使用中,发现上述的定时做法,存在一点小问题,就是无法让定时事件停止。

在.h文件中设置一个QTimer

QTimer* _Timer;

在.cpp中使用方式:

void BatteryCell::init(){
    _Timer= new QTimer();
    _Timer->setInterval(10000);	//10s
    connect(_Timer, SIGNAL(timeout()), this, SLOT(timerFunc()));
    _Timer->start();//启动计时器
    /*
    *其他事件
    */
    _Timer->stop();//停止计时器
}

void BatteryCell::timerFunc()
{
    /*
    *需要定时执行的事件
    */
}

如果需要用来计时,并返回当下已记录的时间,可以使用

在.h文件中添加头文件

#include 

并添加函数

QElapsedTimer* _chargingTimer;

 在.cpp文件使用方式:

void BatteryCell::init(){
    _chargingTimer= new QElapsedTimer();
    _chargingTimer->start();
    _chargingTimer->invalidate();//标记无效
    if(_chargingTimer->isValid()){//有效
        int currentChargingTime=_chargingTimer->elapsed();//记录下的时间长度
    }
}

你可能感兴趣的:(QT,qt,开发语言)