Qt定時器的應用及精度設定

2021-09-11 10:23:38 字數 1523 閱讀 9735

開發環境

windows 10 企業版

qt 5.9.7+mingw

眾所周知,在qt中有兩個方法可以實現定時器,乙個是用qtimer類,另乙個是用qobject的定時器事件。(關於qtimer類和qobject的定時器事件的介紹與使用,大家可以自行找資料)

我在開發過程中遇到的問題是:記錄過程中,資料丟失(不管是用qtimer類還是qobject的定時器事件)。後來我把記錄的時間列印出來,發現每次進入定時器的處理函式時,時間都比原來的加了10+毫秒。所以應該是定時器的精度不滿足要求。後來,我檢視資料,發現在qt的定時器中有3種精度,分別是:常量值

描述qt::precisetimer

0精確的定時器,盡量保持毫秒精度。

qt::coarsetimer

1粗略的定時器,盡量保持精度在所需的時間間隔5%範圍內。

qt::verycoarsetimer

2很粗略的定時器,只保留完整的第二精度。

而qtimer和qobject的定時器事件的預設精度型別都是qt::coarsetimer。所以為了提高定時器的精度,我們需要設定定時器的精度。設定方法如下:

qtimer類,在初始化定時器物件的時候呼叫settimertype(qt::timertype atype)函式,即settimertype(qt::precisetimer);

qobject的定時器事件,在呼叫starttimer()函式的時候,指定定時器的精度,即starttimer(interval, qt::precisetimer);

在把定時器的精度設定為qt::precisetimer後,我發現定時器的精度確實變高了,誤差只有1毫秒左右 ,而且會自動補償,誤差不會累加 。自己測試誤差20毫秒左右,設定定時器為1ms時。

如果用的非實時作業系統(windows、ios、android等),不可能做到1ms的精度,因為作業系統的時間輪詢都得5ms,在windows作業系統上,非server版(winxp/7/8/10)每個子執行緒的事件輪詢是7~8個時間片(5*5ms),server版( winserver2003/2008 )每個子執行緒的事件輪詢是3~5個時間片。要想用高精度定時(小於15ms),只能用實時作業系統,利用硬體的中斷來做。

**:

qtimer *timer = new qtimer

(this)

;connect

(timer,

signal

(timeout()

), this,

slot

(updatetime()

)); timer->

settimertype

(qt:

:precisetimer)

; timer->

start(1

);

執行一次的定時器

qtimer:

:singleshot

(200

, this,

slot

(updatecaption()

));

Qt高精度定時器

一般而言,qt有兩種使用定時器的方式,qobject和qtimer,對於第一種需要重寫timerevent事件來實現,第二種需要宣告乙個qtimer的物件或指標,用qtimer timeout 訊號連線槽函式,設定定時器型別mtimer.settimertype qt precisetimer 第一...

定時器的精度問題

摘自羅雲彬的 win32彙編教程 由於windows的定時器同樣是基於時鐘中斷的,所以雖然引數的單位是ms,但精度還是55 ms,如果指定乙個小於55 ms的週期,不管是1 ms還是54 ms,windows最快也只能在每個時鐘中斷的時候觸發這個定時器,也就是說,實際上這個定時器是以55 ms為觸發...

Qt定時器及實現(詳解)

定時器是用來處理週期性事件的一種物件,類似於硬體定時器。例如設定乙個定時器的定時週期為 1000 毫秒,那麼每 1000 毫秒就會發射定時器的 timeout 訊號,在訊號關聯的槽函式裡就可以做相應的處理。qt 中的定時器類是 qtimer。qtimer 不是乙個可見的介面元件,在 ui 設計器的元...