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…

C语言 链表

// LinkTable.cpp : Defines the entry point for the console application. // 程序运行&#xff0c;用户输入学生数&#xff0c;根据用户输入学生数&#xff0c;动态创建链表&#xff0c;提示输入学生 // 姓名、成绩&#xff0c;最后输出所有学生数据以及平均成绩 #include &…

Python | 重命名现有文件(os.rename()方法的示例)

重命名现有文件 (Renaming an existing file) To change the name of an existing file – we use "rename()" method of "os" module – so to access the "rename()" method, we must have to import the module "os". 要更改现有文…

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

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

c语言limits.h_ (limits.h)C ++中(整数类型的大小)的宏常量

c语言limits.hC 宏常量(整数类型的大小) (C Macro constants of (sizes of integral types)) In this tutorial, we are learning about some of the defined macro constants which are used to find the sizes of the integral types like a character, short, integer, long…

怎样让VB6程序只能运行一次

方法一&#xff1a;利用PrevInstance属性If App.PrevInstance ThenCall MsgBox("对不起本程序已在运行中, 不得重复加载!!", vbCritical)EndEnd If优点&#xff1a;简单方便、缺点&#xff1a;针对性不强、随意复制一份即可再次运行、方法二&#xff1a;创建互斥体&a…

PLSQL_性能优化系列15_Oracle Explain Plan解析计划解读

2014-12-19 Created By BaoXinjian 一、摘要 在SQL语句的执行计划中&#xff0c;包含很多字段项和很多模块&#xff0c;其不同字段代表了不同的含义且在不同的情形下某些字段、模块显示或不显示&#xff0c;下 面的描述给出了执行计划中各字段的含义以及各模块的描述。 二、执行…

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

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

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

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

工程中多个不同类型线程池_软件工程中不同类型的设计策略

工程中多个不同类型线程池As we know that the designing phase is probably the second phase in the software development lifecycle, which comes after the feasibility testing and requirement analysis phase. As the name itself defines that in this phase, the sof…

vb检查磁盘类型

Option ExplicitPrivate Declare Function GetDriveType Lib "kernel32.dll" Alias "GetDriveTypeA" (ByVal nDrive As String) As LongPrivate Sub Command1_Click()Select Case GetDriveType("C:\")Case 0MsgBox "未知类型", vbExcl…

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

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

将十进制转化为八进制的算法_十进制系统转换为八进制系统

将十进制转化为八进制的算法Converting a number from Decimal to Octal is almost similar to converting Decimal into Binary, although just one difference is that unlike Binary conversion, here in an integral part, we successively divide the number by 8 until t…

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

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

VC函数中的延时操作

说到程序中的延时&#xff0c;你会想到怎么做&#xff0c;新开一个线程&#xff1f;如果我的程序只用单线程&#xff0c;却又想让函数等上10秒才返回值&#xff0c;而且还不能像使用Sleep函数那样不能处理其它消息呢&#xff1f;我在这里把论坛里能见到的几种延时方式总结一下。…

Eclipse中SVN的安装步骤(两种)和用法

一、给安装EclipseSVN&#xff0c;最常见的有两种方式&#xff1a;手动方式和使用安装向导方式。详细过程例如以下&#xff1a; 方式一&#xff1a;手动安装 1、从官网下载site-1.6.9.zip文件,网址是:subclipse.tigris.org2、从中解压出features与plugins目录&#xff0c;拷贝到…

c构造函数和析构函数_C ++构造函数和析构函数| 查找输出程序| 套装3

c构造函数和析构函数Program 1: 程序1&#xff1a; #include <iostream>using namespace std;class Sample {private:int X;public:Sample(){X 0;}void set(int x){X x;}void print(){cout << X << endl;}};int main(){Sample S[2] { Sample(), Sample()…

XP定时关机

&#xff08;1&#xff09;自己的电脑有时在整理或者下载东西&#xff0c;需要很长时间等待。但是自己因为要休息的原因&#xff0c;不能一直等在电脑弄完后关机。所以这时需要对XP设置定时关机。比如预计这个下载任务完毕后在23:50可以关机&#xff0c;那么点击开始&#xff0…

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

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

stl取出字符串中的字符_在C ++ STL中使用比较运算符比较两个字符串

stl取出字符串中的字符字符串作为数据类型 (String as datatype) In C, we know string basically a character array terminated by \0. Thus to operate with the string we define character array. But in C, the standard library gives us the facility to use the strin…