QTimer与事件循环理解

问题分析

最近在使用QT的时候发现了某些问题,查阅资料最后总结一下。我起初是想用QT在界面还在加载时加载一副动画,然后动画下面有加载的滚动条代表时间,由于测试所以界面加载没写很多东西很快就加载完成了。我就想让他加载慢点我看看效果。所以我想没过1秒就让滚动条进度加1。

问题解决

我定义一个QTimer变量让他在一边计时,每过多久就给我传过来一个数据。由于QSplashScreen在窗口初始化完成后就会消失,所以我不得不在住线程里面用个while让他在主窗口显示前阻塞在那里。这样的话就得开一个线程让QTimer进行计时。然后就逐步调入坑中…。通过qDebug() << "Thread_Time: " << QThread::currentThreadId();逐步打印线程id最终发现只有run()中的操作才在新的线程中。所以我在run()中加入如下代码:

void myThread::run()
{	QTimer* timer = new QTimer();qDebug() << "run() : " << QThread::currentThreadId();timer->setInterval(10);connect(timer, SIGNAL(timeout()), this, SLOT(StartTime()),Qt::DirectConnection);//Qt::DirectConnection 重要timer->start();exec();//重要return;
}
void myThread::StartTime()
{	if (indx > 100){quit();return;}QMutexLocker locker(&mutex);indx++;emit TimeChanage(indx);qDebug() << "myThread::StartTime() : " << QThread::currentThreadId();
}

connect中第五个参数不能使用默认的,因为信号的发送者和接收者不在同一个线程中。void myThread::StartTime()还在父线程中而run()中的内容在新的线程中,所以要用Qt::DirectConnection,你可以理解为他的作用是当接收到信号时,他就直接调用槽函数,不需要进行事件的循环。如果用默认的话(由于发送者和接收者不在一个线程中)那么他会匹配使用Qt::QueuedConnection,这样的后果是槽函数不会立刻被调用,他会进入主程序的事件循环中,由于我主程序已经阻塞了所以他永远都掉不了槽函数。并且QTimer的运行依赖于事件循环,所以新的线程中要自己手动的开启事件循环exec()。

QTimer事件循环的理解

QTimer的运行依赖于事件循环,计时器不会自行启动线程或事件循环。在没有事件循环的情况下,它不会做任何事情。调用QTimer::start()后仅仅是在系统的定时器向量表中添加了一个定时器对象,但定时器并没有真正开启。使用start()方法,您只是告诉QTimer,当事件循环存在时,必须启动QTimer的逻辑,如果没有事件循环,则QTimer将无法工作。定时器的开启需要通过processEvent()开始的一系列调用后才会真正得开启,这个过程中会处理定时器向量表中所有的定时器对象。那么实际exec()中也是在不断地调用processEvent()方法。

最终效果

在这里插入图片描述
下面这个滚动条会一秒增加一格,由于我主线程阻塞了所以他在加载的过程中点不了其他的东西,不过在实际的运用中不会这样写,在实际的运用中先获去需要初始化的窗口数然后利用for循环和QDateTime::currentDateTime()来实现滚动条的加载。https://github.com/xu6666/QTimer-.git

结论

QTimer的运行依赖于事件循环,上面出现的问题是我自己写一个deom遇到的,在正常的项目中不会出现这种问题。
后续我会将源码贴上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545927.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MYSQL 数学运算符问题

背景&#xff1a; 在mysql中 ’stringA stringB 这种类型的操作&#xff0c;在mysql内部会自动转化为两个double 数进行运算。 -------------------------------------------------------------------------------------------------------------------------------- 例子&a…

面试系列第1篇:常见面试题和面试套路有哪些?

作者 | 面哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;面试是人生中为数不多的改变自身命运的途径之一&#xff0c;当然有效的准备面试也是人生中为数不多的低投入高回报的…

漫话:应用程序被拖慢?罪魁祸首竟然是Log4j!

之前一段时间&#xff0c;为我们发现的一个SaaS应用程序会间歇性地卡顿、变慢&#xff0c;因为很长时间都没有定位到原因&#xff0c;所以解决的办法就只能是重启。这个现象和之前我们遇到的程序变得卡顿不太一样&#xff0c;因为我们发现这个应用程序不仅在高流量期间时会变慢…

面试系列第2篇:回文字符串判断的3种方法!

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;回文字符串判断是面试和笔试中常见的面试题之一&#xff0c;同时也是 LeetCode 中一道经典的面试题&#xff0c;那么…

Activity具体解释(生命周期、以各种方式启动Activity、状态保存,全然退出等)...

一、什么是Activity&#xff1f; 简单的说&#xff1a;Activity就是布满整个窗体或者悬浮于其它窗体上的交互界面。在一个应用程序中通常由多个Activity构成&#xff0c;都会在Manifest.xml中指定一个主的Activity&#xff0c;例如以下设置 <actionandroid:name"androi…

阿里为什么推荐使用LongAdder,而不是volatile?

这是我的第 87 篇原创文章作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;阿里《Java开发手册》最新嵩山版在 8.3 日发布&#xff0c;其中有一段内容引起了老王的注意&#…

当当花160买400的书,确定不囤一波?

天空飘来五个字&#xff0c;快要开学啦快快让路 ║ 今天我要去上学喽新学期我决定一定要努力学习没有新书给我充电怎么行&#xff1f;每次买完新书&#xff0c;感觉都是在开一场私人签售会哈哈哈这感觉真不错当当网自营图书大促>> 每满100减50 <<满200减100满300减…

万字详解Lambda、Stream和日期

作者&#xff1a;虚无境来源&#xff1a;cnblogs.com/xuwujing/p/10145691.html前言本篇主要讲述是Java中JDK1.8的一些语法特性的使用&#xff0c;主要是Lambda、Stream和LocalDate日期的一些使用。Lambda“Lambda 表达式(lambda expression)是一个匿名函数&#xff0c;Lambda表…

Java 中 10 大坑爹功能!

今天我们就来聊一下 Java 中的 10 大坑爹功能&#xff0c;它们分别是&#xff1a;1.switch必须加上break才结束2.逻辑运算符的“短路”现象3.数组下标从零开始4.ArrayList遍历删除时报错5.字符转成数字的坑6.while循环体的“障眼法”7.Integer类有缓存8.空方法体导致死循环9.神…

ORA-00304: requested INSTANCE_NUMBER is busy

为什么80%的码农都做不了架构师&#xff1f;>>> 昨天在项目现场弄oracle rac环境的时候&#xff0c;遇到了这个问题&#xff0c; 由于是rac环境&#xff0c;单独启动一个实例之后&#xff0c;在启动另外一个实例的时候报错了这个错误ORA-00304: requested INSTANCE…

多图证明,Java到底是值传递还是引用传递?

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;开篇先来曝答案&#xff0c;在 Java 语言中&#xff0c;本质只有值传递&#xff0c;而无引用传递&#xff0c;解释和证明详见…

图解面试题:找出数组中重复的数字?

今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题03. 数组中重复的数字。题目链接&#xff1a;https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/一、题目描述 找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0&#xf…

调研了100+开源博客,发现这5个最好用!

最近想倒腾一下博客&#xff0c;看了很多现成的比较成熟的开源博客系统&#xff0c;自己也简单从下面几个维度总结对比了一下&#xff1a;star 数量技术选型社区生态当然啦&#xff01;好东西不能独享&#xff0c;下面简单分享一下我所做的笔记&#xff08;文末有提供所有项目的…

3种时间格式化的方法,SpringBoot篇!

时间格式化在项目中使用频率是非常高的&#xff0c;当我们的 API 接口返回结果&#xff0c;需要对其中某一个 date 字段属性进行特殊的格式化处理&#xff0c;通常会用到 SimpleDateFormat 工具处理。SimpleDateFormat dateFormat new SimpleDateFormat("yyyy-MM-dd"…

linux系统怎么改为中文版(转)

linux系统安装好后怎么改为中文版呢&#xff1f;今天就跟大家介绍下linux系统改为中文版的方法&#xff0c;希望能帮助到大家&#xff01; 以下是linux系统改为中文版的四种方法&#xff0c;一起来看看&#xff1a; 方法1&#xff1a;写入环境变量 echo "export LANG"…

两难!先更新数据库再删缓存?还是先删缓存再更新数据库?

前言当我们在做数据库与缓存数据同步时&#xff0c;究竟更新缓存&#xff0c;还是删除缓存&#xff0c;究竟是先操作数据库&#xff0c;还是先操作缓存&#xff1f;本文带大家深度分析数据库与缓存的双写问题&#xff0c;并且给出了所有方案的实现代码方便大家参考。本篇文章主…

String中删除空格的7种方法!

字符串&#xff0c;是Java中最常用的一个数据类型了。我们在日常开发时候会经常使用字符串做很多的操作。比如字符串的拼接、截断、替换等。本文我们介绍一个比较常见又容易被忽略的一个操作&#xff0c;那就是移除字符串中的空格。其实&#xff0c;在Java中从字符串中删除空格…

URL 去重的 6 种方案!(附详细代码)

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;URL 去重在我们日常工作中和面试中很常遇到&#xff0c;比如这些&#xff1a;可以看出&#xff0c;包括阿里&#xff0c;网易…

阿里巴巴为什么禁止使用Apache Beanutils进行属性复制?

作者 l Hollis来源 l Hollis&#xff08;ID&#xff1a;hollischuang&#xff09;在日常开发中&#xff0c;我们经常需要给对象进行赋值&#xff0c;通常会调用其set/get方法&#xff0c;有些时候&#xff0c;如果我们要转换的两个对象之间属性大致相同&#xff0c;会考虑使用属…

台达A2-M伺服

地址: P3.00 从站地址0x01~0x7F【1~127】 P3.01 通讯速度UZYX【0403】 X:0【4800】1【9600】2【19200】3【38400】4【57600】5【115200】Z:0【125Kbit/s】1【250】2【500】3【750】4【1Mbit/s】 P3.02 通讯格式6【8N2】7【8E1】8【8O1】 P3.03 1通讯错误刹停…