百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Qt QElapsedTimer 计时器

csdh11 2025-03-05 15:00 43 浏览

  QElapsedTimer提供了一种快捷的计算流逝时间的方法。它通常被用来计算两个事件或操作之间过去了多久。并且,该类的方法非常类似于我们之前讲过的QTime类的三个计时函数,所以,我们可以很快速的在使用这两个类的代码之间进行移植。但是,不像QTime,QElapsedTimer会尽可能的使用某种单调时钟。这也就意味着,没办法将QElapsedTimer对象转换成人类可读的时间格式。

  这个类的典型使用方法就是测量一个耗时操作花了多少时间。最简单的例子如下:

1 QElapsedTimer timer;  
2 timer.start();  
3 slowOperation1();  
4 qDebug() << "The slow operation took" << timer.elapsed() << "milliseconds";

  在这个例子中,我们下定义了一个QElapsedTimer的对象,然后调用它的start() 方法开始计时,完成一个耗时操作后,再调用它的elapsed() 方法,得到耗时操作所花费的具体时间,以毫秒计算。

  我们也可以在一个耗时操作完成后,通过elapsed() 函数的返回值来决定下一个耗时操作可以运行的时间。这对于需要在一定的时间周期内完成几个耗时操作来说是至关重要的。比如下面代码所展现的案例:

 1 void executeSlowOperations(int timeout)  
 2 {  
 3     QElapsedTimer timer;  
 4     timer.start();  
 5     slowOperation1();  
 6   
 7     int remainingTime = timeout - timer.elapsed();  
 8     if (remainingTime > 0)  
 9         slowOperation2(remainingTime);  
10 } 

  另一个QElapsedTimer的使用案例是,一个具体的操作需要运行一定的时间长度。对于这种需求,QElapsedTimer提供了hasExpired() 函数,这个函数可以判断自从上次调用start() 或restart() 之后,是否过去了多少毫秒。如下代码所示:

【领QT开发教程学习资料,点击下方链接莬费领取↓↓,先码住不迷路~】

点击→领取「链接」

1 void executeOperationsForTime(int ms)  
2 {  
3     QElapsedTimer timer;  
4     timer.start();  
5   
6     while (!timer.hasExpired(ms))  
7         slowOperation1();  
8 }

  上面我们说,QElapsedTimer会使用运行平台所支持的某种单调参考时钟。这具有额外的好处,它可以使QElapsedTimer不受系统时间调整的影响,也不受系统时区设置的影响。当然,相对的,这也意味着我们只能把QElapsedTimer的值和那些使用了同样参考时钟的值相比较。特别是,当我们把QElapsedTimer的自从参考点以来的值序列化到某个变量中后,更应该注意这点。并且,不应该把这些值通过网络进行交换或存储到磁盘,因为无法保证接收端的计算机和产生该值的计算机是否使用同一种参考时钟和参考点,也无法保证其自从参考点以来是否发生过重启。但是,我们可以将这些值在运行在同一太机器上的不同进程间进行交换,条件是他们都使用相同的参考时钟。QElapsedTimer在同一台机器上总是使用相同的参考时钟,所以,在一个进程中比较来自另一个进程的QElapsedTimer值是安全的。

  注意,QElapsedTimer所使用的时钟类型,有一些是有范围限制的,通常是32-bit,当达到上限时会发生溢出。QElapsedTimer会处理这种情况并提供一致时间。但是,当从QElapsedTimer中提取时间时,同一机器上的两个不同的进程会对实际逝去的时间有不同的理解。


下面,我们就来具体看下QElapsedTimer所使用的集中时钟类型:

SystemTime

该类型的时钟是唯一一种表示实时时间的时钟,它表示子1970.1.1零点以来的毫秒数。它就相当于C或POSIX中的time() 函数,外加毫秒值。这种时钟类型目前只用于不支持 单调时钟的Unix系统。它也是QElapsedTimer可能使用的唯一一种非单调时钟。

MonotonicClock

表示系统的单调时钟,表示的是自过去任意时间点以来的毫秒数。这种时钟类型用于支持POSIX时钟类型的Unix系统(_POSIX_MONOTONIC_CLOCK)。并且,这种时钟类型不会发生溢出。

TickCounter

这种时钟类型的计时基于系统的或处理器的tick数,然后再乘以一个tick的周期。这种时钟类型用于Windows系统。并且,当高精度的性能计数器可用时,会自动使用PerformanceCounter替代这种时钟类型。TickCounter是唯一一种可能发生溢出的时钟类型。但在Windows Vista 和 Windows server 2008上,由于它们支持扩展的64-bit tick counter,可以避免溢出。

在Windows平台,时钟会在2^32毫秒,即大约49.7天后溢出。这也意味着两个不同的进程通过乘以2^32毫秒来计算逝去的时间,得到的结果可能是不同的。当进行这类数值得比较时,我们建议将毫秒的高32位屏蔽掉。

MachAbsoluteTime

这种时钟类型是基于Mach kernels 表示的绝对时间,例如 OS X。把这种时钟类型和MonotonicClock区分开是因为OS X 和 IOS也是Unix系统,也可能支持一种和Mach绝对 时间具有不同值的POSIX单调时钟。这种时钟是单调的并且不会发生溢出。

PerformanceCounter

这种时钟类型使用Windows的QueryPerformanceCounter() 和 QueryPerformanceFrequency() 函数访问系统的高精度性能计数器。但因为这种计数器并不是在所有平台上都可用,所以,QElapsedTimer会在该时钟类型不可用时,自动使用TickCounter作为替代。这种时钟类型也是单调的并且不会发生溢出。

搞明白每一种可用的时钟类型和单调性后,我们可以在程序中使用clockType() 函数来获得一个QElapsedTimer对象所使用的底层时钟类型;使用isMonotonic() 函数判断一个QElapsedTimer对象的单调性。

最后,至于该类的使用方式,上面的例子也说的差不多了,最常用的就是start()、restart()、elapsed()这些函数。其他的函数,大家在需要时可以参考Qt帮助文档。

相关推荐

IDEA界面太丑??尝试一下这几个插件

前言IntelliJIDEA主要用于支持Java、Scala、Groovy等语言的开发工具,同时具备支持目前主流的技术和框架,擅长于企业应用、移动应用和Web应用的开发。IntelliJi...

小巧 Vue 页面滚动进度条组件ScrollProgress

今天给大家分享一个轻量级Vue.js全屏滚动进度条组件VueScrollProgress。vue-scroll-progress一款基于vue.js构建的页面滚动进度条组件,...

基于vue实现可视化拖拽编辑器,页面生成工具,提升前端开发效率

项目介绍基于vue实现的可视化拖拽编辑器,实现页面生成工具,提升前端开发效率。可以基层到移动端项目作为自定义json直接生成UI页面。项目特点功能特点...

优秀 vue+heyui 后端管理系统HeyUI-Admin

今天再给小伙伴们推荐一款成熟的企业中后台管理系统HEYUI-Admin。heyui-admin基于vue.js和heyui组件库构建的后台管理系统。包含基础表单/表格功能,拓展组件(图表、富文本编辑...

响应式 Vue.js 前端组件化框架Xvue-UI

今天给小伙伴们推荐一款超不错的Vue轻量级组件框架XVueUI。xvue-ui基于vue2.x构建的响应式前端组件化框架。轻量级、易于上手,提供...

《基于SpringBoot+Vue的在线视频系统设计与实现》开题报告

【计算机毕业设计案例】基于SpringBoot+Vue的在线视频系统设计与实现_哔哩哔哩_bilibili...

超好用 Vue.js 图片裁切组件Vue-ImgCutter

今天给小伙伴们分享一个超棒的Vue图片任意裁剪插件VueImgCutter。vue-img-cutter基于vue2.x构建的轻量级剪切图片组件。支持移动图像、放大缩小图片、任意移动图片、固定比...

Vue 3 进阶用法:异步组件(vue 异步组件原理)

一、代码分割一个大型前端应用,如果所有代码都放在单一文件,体积会特别大,下载时间长,白屏时间久,用户体验差。...

源码补丁神器—patch-package(源码助手怎么用)

作者:张浩一、背景vue项目中使用vue-pdf第三方插件预览pdf,书写业务代码完美运行,pdf文件内容正常预览无问题。后期需求有变,业务需求增加电子签章功能。这个时候pdf文件的内容可以显示出...

经验分享:Vue2 项目升级 Vue3 + Element Plus,借助Deepseek手动升级

Vue3出来好久了,我开发的项目还在使用Vue2框架,一般情况下不考虑升级,但是最近需要接入工作流程引擎之类的,看了下Vue2生态下操作空间不是很好,那索性尝试升级Vue3吧。一番操作下来,升级成功,...

34K Star!史上最全JavaScript资源库 awesome-javascript

34KStar!史上最全JavaScript资源宝库大揭秘引言在GitHub上,有一个备受瞩目的JavaScript资源仓库,以其全面的内容和精心的分类,成为了众多开发者的必备参考。这个拥有超过...

基于 Vue.js 磁片栅格布局组件VueGridLayout

#头条创作挑战赛#今天给大家分享一个超优秀的vue.js拖拽栅格布局插件VueGridLayout。...

6款高颜值 Vue3 PC端UI组件库(vue3开发组件库)

马上到国庆了,还没学习或者想学习vue3的小伙伴们有安排上没?这次推荐几个比较流行的VUE3UI组件库,合理利用,又或者学习借鉴都是不错的选择。1、element-pluselement-plus...

高性能 vue.js+ztree 树形组件Vue-GiantTree

今天给大家分享一款超棒的Vue海量数据渲染树形组件VueGiantTree。vue-giant-tree基于ztree封装的Vue树形组件。轻松实现大数据高性能渲染,适合海量数据渲染场景。zTr...

【推荐】2024年推荐的6款开源免费 Vue 后台管理系统模板,建议收藏

前言在现今的软件开发领域,...