開發環境
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 設計器的元...