0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

几种Qt种延时处理方法

strongerHuang 来源:CSDN 作者:CSDN 2022-05-31 09:30 次阅读

嵌入式软件开发过程中,基本都会用到“延时”,本文分享几种Qt种延时处理方法。

一、阻塞型延时

阻塞的原理就是:在延时期间,本线程的事件循环得不到执行。

1、QThread类的sleep()

最简单的延时方法就是使用QThread类的sleep(n)、msleep(n)、usleep(n),这几个函数的不良后果就是,GUI会在延时的时间段内失去响应,界面卡死,所以,这三个函数一般用在非GUI线程中。

QThread::msleep(50);//阻塞延时50ms

2、使用定时器:死等

voidDelay_MSec_Suspend(unsignedintmsec)
{
QTime_Timer=QTime::currentTime().addMSecs(msec);
while(QTime::currentTime()< _Timer );
}

二、非阻塞延时

原理无非就是利用事件循环,有两种原理:

1、处理本线程的事件循环

在等待中,不断强制进入当前线程的事件循环,这样可以把堵塞的事件都处理掉,从而避免程序卡死

voidDelay_MSec(unsignedintmsec)
{
QTime_Timer=QTime::currentTime().addMSecs(msec);
while(QTime::currentTime()< _Timer )
        QCoreApplication::AllEvents, 100);
2、使用子事件循环

创建子事件循环,在子事件循环中,父事件循环仍然是可以执行的

voidDelay_MSec(unsignedintmsec)
{
QEventLooploop;//定义一个新的事件循环
QTimer::singleShot(msec,&loop,SLOT(quit()));//创建单次定时器,槽函数为事件循环的退出函数
loop.exec();//事件循环开始执行,程序会卡在这里,直到定时时间到,本循环被退出
}

三、耗时代码的处理

假设有这样的应用情景:点击某个button之后,需要读入并处理一幅图像,需要耗时20秒才能处理完。

在这20s内,GUI会失去效应,界面上的任何元素都无法被点击,这种情况应该怎么办?方法有两种:1、用另一个线程去处理这个耗时任务;2、在耗时任务中,不断地去处理本线程的事件循环,以保证GUI的及时响应。

for(i=0;i< 1000000; i++)
{
    //QCoreApplication::AllEvents);    //去处理本线程的事件循环,避免本线程被堵塞
    QCoreApplication::AllEvents, 5);//如果不够频繁,可以增加第二参数来缓解卡顿
 
    for(j=0;j< 1000000; j++)
    {
        //QCoreApplication::AllEvents);//处理事件循环,不建议放在这里,可能过于频繁
        doSomeThing();
    }
}

一般来说,processEvents()不宜被调用的过于频繁,也不宜被调用的不够频繁。过于频繁的话,一方面会使线程的响应更好,但另一方面会导致原本就耗时的任务变得更加耗时;不够频繁的话,显然可能会使GUI线程的响应变差,例如每500ms才被调用一次,那么GUI的事件循环就只能500ms才被处理一次,当然,这个问题可以通过设定processEvents()的第二个形略微得到缓解,更好的做法是,保证被调的周期<200ms(再小一些更好,看程序需求),这样不至于肉眼可见的卡顿。

副作用:(特别注意!)

1、在点击按钮之后,这个20s的耗时任务开始执行,尚未执行完毕时,我们点击了GUI的关闭按钮,那么GUI会立即消失,但是这个耗时任务仍然会在后台执行,直到执行完毕,进程才会退出。解决办法:重写关闭事件,在关闭事件的函数中直接结束进程。

2、在点击按钮之后,这个20s的耗时任务开始执行,执行到第5秒时,我们再次点击了这个按钮,那么QT又会执行一个新的20s任务,这个新任务完成后,又会接着把第一个20s任务从上次被打断的第5秒继续执行。如果这个任务是可重入的,后果仅仅是被执行了两遍,如果任务不可重入,那情况就彻底糟糕了。解决办法:点击按钮后把这个按钮disable掉,执行完再enable

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 延时
    +关注

    关注

    0

    文章

    106

    浏览量

    25198
  • 函数
    +关注

    关注

    3

    文章

    3845

    浏览量

    61215
  • 嵌入式软件
    +关注

    关注

    4

    文章

    223

    浏览量

    26361

原文标题:几种延时处理方法

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Qt上位机开发实战案例

    Qt Creator是一个用于Qt开发的轻量级跨平台集成开发环境。 Qt Creator可带来两大关键益处: 提供首个专为支持跨平台开发而设计的集成开发环境 (IDE),并确保首次接触
    的头像 发表于 03-13 12:31 232次阅读
    <b class='flag-5'>Qt</b>上位机开发实战案例

    pcb表面处理几种工艺介绍

    PCB表面处理是指在印刷电路板(PCB)制造过程中,对PCB表面进行处理以改善其性能和外观。常见的PCB表面处理方法有以下几种: 热风整平
    的头像 发表于 01-16 17:57 555次阅读
    pcb表面<b class='flag-5'>处理</b>的<b class='flag-5'>几种</b>工艺介绍

    QT串口通信的简单使用

    QT串口通信是上位机和下位机通信常用的通信方式, 也是学习QT必须学会的基础知识, 这篇就简单介绍一下QT串口通信的简单使用.
    的头像 发表于 01-15 09:27 422次阅读
    <b class='flag-5'>QT</b>串口通信的简单使用

    PWM产生的几种方法总结

    PWM产生的方法有很多种,小编将常用的几种产生方法作了一个整理以及分类,下面我们来了解一下。
    的头像 发表于 01-11 09:15 633次阅读
    PWM产生的<b class='flag-5'>几种方法</b>总结

    延时器的接线方法

    延时器是一种常用的电子设备,广泛应用于工业控制、家电控制等领域。它可以提供一段预设的时间延迟,用于控制电路的开关或触发不同的动作。接下来将介绍延时器的接线方法。 常见的延时器接线
    的头像 发表于 12-15 11:21 897次阅读

    教你几种电路分析的高效方法

    教你几种电路分析的高效方法
    的头像 发表于 12-15 09:16 402次阅读
    教你<b class='flag-5'>几种</b>电路分析的高效<b class='flag-5'>方法</b>

    延时器的接线方法有哪些

    延时器是一种常用的电子元器件,用于在电路中引入延时。通过控制电流或电压的幅度、时间或波形,延时器可以实现多种电路功能。在接线过程中,正确的方法对于确保
    的头像 发表于 12-13 18:12 629次阅读

    几种常用的产生负电源的方法

    几种常用的产生负电源的方法
    的头像 发表于 12-05 15:54 651次阅读
    <b class='flag-5'>几种</b>常用的产生负电源的<b class='flag-5'>方法</b>

    如何使RC延时电路无延时呢?

    如何使RC延时电路无延时呢? RC延时电路是一种常见的电子电路,用于在电路中引入一个可控的时间延迟。然而,有时候我们可能需要使RC延时电路无延时
    的头像 发表于 11-20 17:05 426次阅读

    Qt For OpenHarmony

    Qt Event队列中,由Qt框架实现对输入的处理,完成对触屏操作和鼠标操作的处理。 基于NAPI的应用框架接口调用:基于OpenHarmony的应用接口规范,部分接口未提供NDK接
    发表于 09-15 15:39

    STM32单片机的延时原理和延时函数方法

    当涉及到单片机编程时,延时是一项常见但关键的任务。在许多应用中,我们需要控制程序暂停一段时间,以实现精确的时间控制或协调不同设备之间的操作。本文将以STM32为例,介绍关于单片机的延时原理以及常用的延时函数
    发表于 08-09 09:13 8894次阅读

    变频器出现跳闸状况处理方法

    变频器在运行中出现跳闸,即视为事故。跳闸事故的处理有以下几种方法
    发表于 06-27 09:25 1736次阅读

    单片机两大延时方法总结

    实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件
    发表于 06-14 09:19 2183次阅读

    QTQT上位机串口编程

    QTQT上位机串口编程 最近因为项目需要,需要用到上位机,通过串口与上位机进行通讯,来上传和下发一些数据以及控制指令,所以用QT写了一个上位机,并记录下来,免得到时候要用又到处翻资料。
    发表于 05-08 10:02 15次下载
    <b class='flag-5'>QT</b>篇<b class='flag-5'>QT</b>上位机串口编程

    pcb线路板表面常见的处理方法有哪几种呢?

    PCB垫表面的铜在空气中容易氧化污染,所以必须对PCB进行表面处理。那么pcb线路板表面常见的处理方法有哪几种呢?
    发表于 04-14 14:34