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

    文章

    110

    浏览量

    26221
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66817
  • 嵌入式软件
    +关注

    关注

    4

    文章

    247

    浏览量

    27816

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    不同地线处理方法

    10MHz的电路,采用多点接地除了正确进行接地设计、安装,还要正确进行各种不同信号的接地处理。控制系统中,大致有以下几种地线: (1)数字地:也叫逻辑地,是各种开关量(数字量)信号的零电位。 (2)模拟
    发表于 12-03 07:38

    tiny4412 Qt环境搭建

    1.硬件环境 PC端:ubuntu18.04 开发板硬件平台:tiny4412 内核版本:linux3.5 交叉编译器:arm-linux-gcc Qt版本:Qt5.6 2.搭建 ubuntu 下
    的头像 发表于 10-21 09:54 254次阅读
    tiny4412 <b class='flag-5'>Qt</b>环境搭建

    创龙 瑞芯微 RK3588 国产2.4GHz八核 工业开发板—Qt工程编译、GPU核心使用说明

    本文围绕创龙科技研发的评估板,详细说明 Qt 工程编译与 GPU 核心使用方法。涵盖基于命令行和 Qt Creator 工具的 Qt 工程编译流程,包括交叉编译工具链、
    的头像 发表于 09-29 14:16 357次阅读
    创龙 瑞芯微 RK3588 国产2.4GHz八核 工业开发板—<b class='flag-5'>Qt</b>工程编译、GPU核心使用说明

    LVGL近期很多人问,那它和Qt哪个好?

    最近拜访做工业控制、智能家居的客户时,常被问到同一个问题:嵌入式产品,GUI选LVGL还是Qt? 其实工具选择没有绝对的“好”与“坏”,但选对适配场景的GUI图形用户界面工具,能直接让产品开发效率
    的头像 发表于 09-23 15:54 794次阅读
    LVGL近期很多人问,那它和<b class='flag-5'>Qt</b>哪个好?

    Linux修改uboot启动延时方法详细攻略,触觉智能RK3568开发板演示

    本文介绍Linux系统修改uboot启动延时方法,使用触觉智能EVB3568鸿蒙开发板演示,搭载瑞芯微RK3568,四核A55处理器,主频2.0Ghz,1T算力NPU;支持开源鸿蒙
    的头像 发表于 06-06 18:07 660次阅读
    Linux修改uboot启动<b class='flag-5'>延时方法</b>详细攻略,触觉智能RK3568开发板演示

    技术分享 | 如何在2k0300(LoongArch架构)处理器上跑通qt开发流程

    技术分享 | 如何在2k0300开发板(LoongArch架构)处理器上跑通qt开发流程
    的头像 发表于 05-20 11:05 650次阅读
    技术分享 | 如何在2k0300(LoongArch架构)<b class='flag-5'>处理</b>器上跑通<b class='flag-5'>qt</b>开发流程

    如何在2K0300开发板上搭建Qt环境

    近期迅为售后团队反馈,许多用户咨询:2K0300处理器采用了LA264处理器核,若要在该处理器上运行Qt程序,由于架构发生了变化,其使用方法
    的头像 发表于 05-16 14:27 441次阅读
    如何在2K0300开发板上搭建<b class='flag-5'>Qt</b>环境

    【技术案例】Qt 环境部署 - Ubuntu 篇

    什么是QtQt是一个跨平台C++图形用户界面应用程序开发框架,可构建高性能的桌面、移动及Web应用程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成
    的头像 发表于 04-16 17:17 1438次阅读
    【技术案例】<b class='flag-5'>Qt</b> 环境部署 - Ubuntu 篇

    延时继电器的工作原理和接线方法

    延时继电器作为一在电气系统中广泛应用的控制元件,具有在电路中实现定时闭合或断开控制的重要功能。通过引入延时功能,对电路系统的精确控制和管理,适应不同的应用场景和需求,提高生产效率、降低
    的头像 发表于 02-07 16:09 2828次阅读

    断电延时继电器的应用

    延时继电器作为一重要的电气控制元件,在现代电气系统中发挥着不可或缺的作用。其基于一个或多个可调的计时器电路,通过与继电器相连的控制电路,实现了在电路中定时闭合或断开控制的功能。 一、工作原理 延时
    的头像 发表于 02-07 16:07 1869次阅读

    Qt Group发布Qt AI Assistant,助力跨平台UI开发

    重复性劳动方面迈出了重要一步。 Qt AI Assistant的核心目标是减少开发者在UI开发过程中所面临的非编码类重复性任务。这些任务往往繁琐且耗时,容易让开发者陷入低效的工作状态。通过引入AI技术,Qt AI Assistant能够智能地
    的头像 发表于 02-07 13:47 1639次阅读

    延时继电器功能汇总与应用

    延时继电器是一在电气系统中广泛应用的控制元件,在电路中实现定时闭合或断开控制,为各种应用场景提供灵活的时间管理功能。 通常,聚英延时继电器由一个控制电压引发,该控制电压可以是任何符合电器设备功能
    的头像 发表于 01-17 16:03 1171次阅读

    延时继电器应用场景

    延时继电器是一在电气系统中广泛应用的控制元件,通过引入延时功能,实现了在电路中定时闭合或断开控制的重要任务。 延时继电器的工作原理,基于一个或多个可调的计时器电路,2路/4路/8路电
    的头像 发表于 01-16 16:27 1101次阅读

    Qt Group发布Qt Accelerate,加速数字产品开发进程

    Qt Group近日正式推出了Qt Accelerate,这是一款专为快速构建数字应用而设计的解决方案,旨在满足工业制造、移动出行、消费类电子等多个领域的需求。 Qt Accelerate基于
    的头像 发表于 01-13 11:19 926次阅读

    ADS8588在做多通道采集时,ADS8588在处理输入信号时有几十微秒的延时,请问有无解决前端延时方法

    ADS8588 在做多通道采集时,采样速率是200KSPS,由于ADS8588内部集成的前端在处理输入的信号有几十微秒的延时,影响了对采集信号的响应,达不到我们设计的ADC处理性能。请问有无
    发表于 12-10 07:55