QT:定时任务

文章介绍了在QT中设置定时任务的两种方法。方法一是利用QObject的timerEvent函数重载,通过startTimer和killTimer控制定时器,适合非阻塞延时。方法二是使用QTimer对象,通过连接timeout信号到槽函数实现定时执行,能方便地启停计时器。另外,文章还提及了QElapsedTimer用于记录时间长度。

目录

学习目标

学习内容

方法一

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


学习目标

在QT中设置定时任务

例如:

  • 每十秒检测一次电池

学习内容

QTimer定时器使用

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


方法一

所有继承自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>

并添加函数

QElapsedTimer* _chargingTimer;

 在.cpp文件使用方式:

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值