几种Qt种延时处理方法

嵌入式软件开发过程中,基本都会用到“延时”,本文分享几种qt种延时处理方法。
一、阻塞型延时 阻塞的原理就是:在延时期间,本线程的事件循环得不到执行。
1、qthread类的sleep() 最简单的延时方法就是使用qthread类的sleep(n)、msleep(n)、usleep(n),这几个函数的不良后果就是,gui会在延时的时间段内失去响应,界面卡死,所以,这三个函数一般用在非gui线程中。
qthread::msleep(50);//阻塞延时50ms 2、使用定时器:死等 void delay_msec_suspend(unsigned int msec){        qtime _timer = qtime::currenttime().addmsecs(msec);    while( qtime::currenttime() < _timer );} 二、非阻塞延时 原理无非就是利用事件循环,有两种原理:
1、处理本线程的事件循环 在等待中,不断强制进入当前线程的事件循环,这样可以把堵塞的事件都处理掉,从而避免程序卡死
void delay_msec(unsigned int msec){    qtime _timer = qtime::currenttime().addmsecs(msec);    while( qtime::currenttime() < _timer )        qcoreapplication::allevents, 100); 2、使用子事件循环 创建子事件循环,在子事件循环中,父事件循环仍然是可以执行的
void delay_msec(unsigned int msec){    qeventloop loop;//定义一个新的事件循环    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


如何保护区块链
牙科针针管刚性测试仪
从2G到5G,核心网,你到底经历了什么?
英创信息技术EM9170工控主板的音频播放介绍
HTC被指控违反了英国法院的一项裁决将在英国下架所有手机
几种Qt种延时处理方法
MK-302语音数据自适应透传模块技术研究与应用
广和通智慧燃气安全物联网解决方案
特斯拉在日本的销售业绩为什么令人失望
如何在电路板轮廓内设计刚性柔性PCB?
为智能网联汽车提供贯穿研发验证到产线测试的智能测试方案
STM32H5开发(5)----串口打印配置
5.8G雷达存在感应芯片和解决方案与应用场景及实测
5月的上海的新能源汽车上牌分析
飞思卡尔半导体推出汽车微控制器产品线S32K
英创信息技术Linux工控主板3G无线上网应用示例
将人工智能推向边缘的创新
如何从一界屌丝走向人生巅峰?
可控硅整流器的工作原理
微软Edge更多细节披露 对Windows 7的支持至少持续到2021年7月