【QT】QT之QElapsedTimer计时

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

这个类主要的使用方法就是测量一个操作耗时多久,例子如下:

  QElapsedTimer timer; //定义对象timer.start();  //开始计时Operation();  //相关操作qDebug() << "The operation took" << timer.elapsed() << "milliseconds"; //显示结果

同时也可以在一个耗时操作完成后,通过elapsed() 函数的返回值来决定下一个操作可以开始运行的时间。这对于需要在一定的时间周期内完成几个具体的耗时操作来说是至关重要的。如下代码所示:

  void ExecuteOperations(int timeout){QElapsedTimer timer;timer.start();Operation1();int remainingTime = timeout - timer.elapsed();if (remainingTime > 0)Operation2(remainingTime);}

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

  void ExecuteOperationsForTime(int ms){QElapsedTimer timer;timer.start();while (!timer.hasExpired(ms))Operation1();}

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

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

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

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

【QT】QT之QElapsedTimer计时相关推荐

  1. QT——Qt QtCreator 官方下载地址

    [系列专栏]:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! <项目案例分享> <极客DIY开源分享> <嵌入式通用开发实战> <C++语言开发基 ...

  2. Qt, QT/E, Qtopia 的区别

    转自Qt, QT/E, Qtopia 的区别 Qt泛指Qt的所有桌面版本,比如Qt/X11,Qt Windows,Qt Mac等.由于Qt最早是在Linux中随着KDE流行开来的,因此通常很多人说的Q ...

  3. Qt | Qt For Android、Qt5.14.2安卓开发环境搭建详细步骤

    Qt | Qt For Android.Qt5.14.2安卓开发环境搭建详细步骤 目录 Qt | Qt For Android.Qt5.14.2安卓开发环境搭建详细步骤 1.简介 2.软件下载 1.J ...

  4. QT - QT中配置MSVC编译环境 以及 VS中配置QT开发环境

    本文主要记录一下如何在 QT5.14.2 中配置 MSVC2017 构建套件,以及在VS2017中配置QT的开发环境.开发环境为 Win10 +  QT5.14.2 + Visual Studio 2 ...

  5. QElapsedTimer计时

    文章目录 前言 1.头文件和命名空间 2.创建QElapsedTimer对象 3.获取已过时间 4.检查计时器是否在运行 5.停止计时器 6.获取计时器的分辨率 使用QElapsedTimer时需要注 ...

  6. linux 界面工具 qt,Qt主窗口中的工具栏

    工具栏类 QToolBar 快捷项 QAcitonQToolBar* tb = addToolBar("Tool Bar");//addToolBar是Qt主窗口的成员函数,在主窗 ...

  7. [Qt]Qt程序发布:在ubuntu下打包成Debian包的过程

    0:在ubuntu下将Qt程序打包,发布成Debian包的过程 下面的步骤对于所有的打包程序都是通用的,所以完全可以写一个脚本,把这个包过程自动化,但是在自动化之前,我们需要弄清楚,一步一步打包是如何 ...

  8. Qt 之 Qt/Qt Lite 自编译详解(VS/MinGW/...)

    2018/3/24 目前QT更新到了5.10.1.文章增加了对该版本的说明. 2020/9/5 目前QT更新到了5.15.0.文章更新了部分内容 写在前面   现在,网上关于 Qt 编译的文章数不胜数 ...

  9. QT | QT MSVC 2015 + VS 2015开发环境配置及GIT设置

    1.下载: 所有Qt版本的下载地址: http://download.qt.io/archive/qt/ 实际使用了http://download.qt.io/archive/qt/5.7/5.7.1 ...

最新文章

  1. SpringBoot使用笔记
  2. Silverlight实例教程 - Navigation导航框架系列汇总
  3. Perl Debug error: SetConsoleMode failed, LastError=|6|
  4. Pytorch List Tensor转Tensor,,reshape拼接等操作
  5. 基于nginx和uWSGI在Ubuntu系统上部署Django项目
  6. Notepad++便签模式
  7. 【招聘】智联NLP算法工程师
  8. 【转载】在回答WCF问题时,在我们的园子找到了一篇彪悍的文章
  9. 更新时卡住_7月2日全区1.693版本更新公告
  10. Oracle安装步骤(自用)
  11. UE4 视差毛发材质
  12. 中国最经典广告语大全
  13. 《算法设计与分析基础》【part1】
  14. cas入门之:cas 4 如何以http形式发布
  15. c语言超市,C语言超市收银系统
  16. Could not set property ‘XXX‘ of ‘class com.entity.XXX‘
  17. ctf入门题库_「ctf比赛」web安全CTF比赛习题(初级) - seo实验室
  18. 一文读懂babel的使用
  19. hadoop jar xxxx.jar 执行的流程
  20. Python中inplace参数

热门文章

  1. Linux下软件安装 非root用户安装软件的一般流程
  2. pgsql 创建dp_link
  3. 无盘工作站的日常维护
  4. 支付宝免密代扣签约SDK后台拼接(JAVA代码)
  5. WinExec(exePath,sw_XX) 调用外部程序详解
  6. 基于博途的反应釜温度PID控制 PLC
  7. 淘宝精准引流:一次布局,长期被动流量
  8. 得到Iphone屏幕分辨率
  9. 《念奴娇.赤壁怀古》
  10. 华云三维CrownCAD携手上飞院,追逐中国“大飞机梦”