哈尔滨小程序,湖南网络优化服务,沈阳网站建设费用,网站 工作室 建设 方案qt定时器的使用一般有以下几种方式#xff1a;
1、直接使用QTimer对象#xff0c;绑定定时器的timeout信号#xff1b;
2、使用QTimer的静态方法singleshot方法#xff0c;产生一个一次性的定时事件
3、在QObject子类中#xff0c;调用startTimer方法#xff0c;产生定…qt定时器的使用一般有以下几种方式
1、直接使用QTimer对象绑定定时器的timeout信号
2、使用QTimer的静态方法singleshot方法产生一个一次性的定时事件
3、在QObject子类中调用startTimer方法产生定时器并在timerEvent方法中实现其处理
以上三种方法本质上都是继承QObject类调用QObject的startTimerkillTimer方法等实现的
QObject类中定时器相关的方法有startTimer、killTimer、timerEvent三个方法
startTimer源码如下 startTimer的实现比较简单主要是向eventDispatcher中注册定时器事件QAbstractEventDispatcher中registerTimer的实现如下 生成一个定时器的id并调用派生类的registerTimer的函数 将定时器相关信息保存在WinTimerInfo结构中并调用QEventDispatcherWin32Private类中的registerTimer方法 首先会重新计算定时的时间间隔调用calculateNextTimeout方法 如果是非常粗糙的定时方式或者定时时间超过2s且定时器类型不是精确定时则定时器的触发时间存在500ms左右的偏差
QZeroTimerEvent事件
如果定时时间间隔为0ms则会调用qt的postEvent方法向QEventDispatcherwin32对象抛一个QZeroTimerEvent事件切入到qt的事件循环中;通过上几节介绍可知通过postEvent抛出的事件最终会进入到qt_internal_proc方法中 最终会进入到q-sendPostedEvents()方法中 几经周转会进入到QEventDispatcherWin32的event方法中此处是ZeroTimerEvent事件会调用QCoreApplication::sendEvent方法向定时器事件的QObject对象发送一个QTimerEvent事件从而转入到QObject的event方法中执行并在此抛出一个QZeroTimerEvent事件
回到registerTimer方法中
PreciseTimer事件
如果定时器事件类型为精确定时会调用windows操作系统的timerSetEvent接口实现精确定时定时精度1ms其对应的回调函数qt_fast_time_proc方法如下: 其会在回调函数中向QEventDispatcherWin32对象post一个QTimerEvent事件最终进入到QEventDispatcherWin32的event函数中调用其sendTimerEvent函数其定义如下 在其方法中会调用QCoreApplication的sendEvent函数最终切入到QObject的event函数中
VeryCoarseTimer事件
精度要求不高的事件会调用windows API的setTimer函数注册一个定时器事件此事件的回调函数为nullptrqt会使用windows系统产生的WM_TIMER事件最终会被qt_internal_proc回调函数捕获到 其会直接调用QEventDispatcherWin32函数的sendTimerEvent方法其余执行流程同上
总结
1、qt定时器会产生3种类型的定时事件 QZeroTimerEvent事件、QTimerEventPreciseTimerQTimerEventVeryCoarseTimer、CoarseTimer
2、当定时间隔为0时会产生QZeroTimerEvent事件其由QCoreApplication的postEvent方法切入到qt的事件循环中几经周转在此回到QEventDispatcher类中执行
3、当定时的精度要求比较高时可以使用PreciseTimer事件类型其调用weindowsAPI的timerSetEvent接口实现高精度定时并在其回调函数中调用postEvent方法切入到qt的事件循环中处理
4、当定时精度要求不高时可以使用默认事件类型即VeryCoarseTimer事件类型其会调用windowsAPI的setTimer接口并产生WM_TIMER事件切入到qt的事件循环中
5、CoarseTimer事件类型会根据其时间间隔决定产生的是精确定时还是粗糙的定时方式。