qt事件系統源碼-----定時器

qt定時器的使用一般有以下幾種方式:

1、直接使用QTimer對象,綁定定時器的timeout信號;

2、使用QTimer的靜態方法singleshot方法,產生一個一次性的定時事件

3、在QObject子類中,調用startTimer方法,產生定時器,并在timerEvent方法中實現其處理;

以上三種方法,本質上都是繼承QObject類,調用QObject的startTimer,killTimer方法等實現的;

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函數,注冊一個定時器事件,此事件的回調函數為nullptr,qt會使用windows系統產生的WM_TIMER事件;最終會被qt_internal_proc回調函數捕獲到;

其會直接調用QEventDispatcherWin32函數的sendTimerEvent方法;其余執行流程同上;

總結:

1、qt定時器會產生3種類型的定時事件?,QZeroTimerEvent事件、QTimerEvent(PreciseTimer),QTimerEvent(VeryCoarseTimer、CoarseTimer);

2、當定時間隔為0時,會產生QZeroTimerEvent事件,其由QCoreApplication的postEvent方法切入到qt的事件循環中,幾經周轉在此回到QEventDispatcher類中執行;

3、當定時的精度要求比較高時,可以使用PreciseTimer事件類型,其調用weindowsAPI的timerSetEvent接口實現高精度定時,并在其回調函數中調用postEvent方法切入到qt的事件循環中處理;

4、當定時精度要求不高時,可以使用默認事件類型即VeryCoarseTimer事件類型,其會調用windowsAPI的setTimer接口,并產生WM_TIMER事件,切入到qt的事件循環中;

5、CoarseTimer事件類型,會根據其時間間隔決定產生的是精確定時還是粗糙的定時方式。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39771.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39771.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39771.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

矢量繪圖UI設計軟件Sketch mac中文版軟件說明

Sketch mac是一款適用于 UI/UX 設計、網頁設計、圖標制作等領域的矢量繪圖軟件。 Sketch mac軟件特點 1. 簡單易用的界面設計:Sketch 的用戶界面簡潔明了,使得用戶可以輕松上手操作,不需要復雜的學習過程。 2. 強大的矢量繪圖功能&#xff1a…

flinksql實時統計程序背壓延遲優化

問題: flinkcdcflinksql做實時讀取sls日志和實時統計業務指標,今天發現程序背壓了,業務延遲了6個小時。解決辦法: 1、資源優化 作業并發大時:在作業的高級配置的資源配置中,增加JobManager的資源&#xf…

香港服務器三網直連內地線路什么意思?好用嗎?

?  三網直連內地是指香港服務器可以直接連接中國內地的電信、聯通和移動三大運營商網絡,避免了中間網絡干線的支持。這樣可以實現直接、快速、穩定的網絡訪問,提高用戶對網絡訪問的效率,減少網絡訪問問題和擁堵的現象。 香港服務器直連內地…

XSS 跨站腳本攻擊

XSS(DOM) XSS 又稱CSS(Cross Site Scripting)或跨站腳本攻擊,攻擊者在網頁中插入由JavaScript編寫的惡意代碼,當用戶瀏覽被嵌入惡意代碼的網頁時,惡意代碼將會在用戶的瀏覽器上執行。 XSS攻擊可分為三種:分別為反射型(Reflected…

線程|線程的使用、四種實現方式

1.線程的實現方式 1.用戶級線程 開銷小,用戶空間就可以創建多個。缺點是:內核無法感知用戶級多個線程的存在,把其當作只有一個線程,所以只會提供一個處理器。 2.內核級線程 相對于用戶級開銷稍微大一點,可以利用多…

Unity C# 之 Azure 微軟SSML語音合成TTS流式獲取音頻數據以及表情嘴型 Animation 的簡單整理

Unity C# 之 Azure 微軟SSML語音合成TTS流式獲取音頻數據以及表情嘴型 Animation 的簡單整理 目錄 Unity C# 之 Azure 微軟SSML語音合成TTS流式獲取音頻數據以及表情嘴型 Animation 的簡單整理 一、簡單介紹 二、實現原理 三、注意事項 四、實現步驟 五、關鍵代碼 一、簡…

01- vdom 和模板編譯源碼

組件渲染的過程 template --> ast --> render --> vDom --> 真實的Dom --> 頁面 Runtime-Compiler和Runtime-Only的區別 - 簡書 編譯步驟 模板編譯是Vue中比較核心的一部分。關于 Vue 編譯原理這塊的整體邏輯主要分三個部分,也可以說是分三步&am…

《vue3實戰》運用radio單選按鈕或Checkbox復選框實現單選多選的試卷制作

文章目錄 目錄 系列文章目錄 1.《Vue3實戰》使用axios獲取文件數據以及走馬燈Element plus的運用 2.《Vue3實戰》用路由實現跳轉登錄、退出登錄以及路由全局守護 3.《vue3實戰》運用Checkbox復選框實現單選多選的試卷展現(本文) 文章目錄 前言 radio是什…

Java中List排序的4種方法

開發過程中經常會遇到讀取文件內容的情況,需要判斷文件是否為文本文件,及文件編碼格式,防止無法讀取內容或亂碼出現情況。 我們可以通過 java.io.File 類包找出文件是目錄還是常規文件。java.io.File 類包含兩種方法,它們分別是&…

TCP服務器—實現數據通信

目錄 前言 1.接口介紹 2.編寫服務器 3.編寫客戶端 4.編譯鏈接 5.測試 6.總結 前言 今天我們要介紹的是使用TCP協議實現數據通信,相比于之前寫的UDP服務器實現數據信,在主體邏輯上并沒有差別。客戶端向服務器發送信息,服務器接受信息并回…

JavaEE初階:多線程 - Thread 類的基本用法

上次我們了解了多線程的五種創建方法,今天來學習Thread的基本用法。 目錄 run和start Thread常見的構造方法 Thread的幾個常見屬性 后臺線程 是否存活 線程終止 1.使用標志位 2.使用Thread自帶的標志 等待線程 run和start 首先需要理解Thread的run和star…

JavaWeb-Listener監聽器

目錄 監聽器Listener 1.功能 2.監聽器分類 3.監聽器的配置 4.ServletContext監聽 5.HttpSession監聽 6.ServletRequest監聽 監聽器Listener 1.功能 用于監聽域對象ServletContext、HttpSession和ServletRequest的創建,與銷毀事件監聽一個對象的事件&#x…

Python源碼05:使用Pyecharts畫詞云圖圖

**Pyecharts是一個用于生成 Echarts 圖表的 Python 庫。Echarts 是一個基于 JavaScript 的數據可視化庫,提供了豐富的圖表類型和交互功能。**通過 Pyecharts,你可以使用 Python 代碼生成各種類型的 Echarts 圖表,例如折線圖、柱狀圖、餅圖、散…

Glide 的超時控制相關處理

作者:newki 前言 Glide 相信大家都不陌生,各種源碼分析,使用介紹大家應該都是爛熟于心。但是設置 Glide 的超時問題大家遇到過沒有。 我遇到了,并且掉坑里了,情況是這樣的。 調用接口從網絡拉取用戶頭像&#xff0c…

3.微服務概述

1.大型網絡架構變遷 SOA與微服務最大的差別就是服務拆分的細度,目前大多數微服務實際上是SOA架構,真正的微服務應該是一個接口對應一個服務器,開發速度快、成本高; 微服務SOA能拆分的就拆分是整體的,服務能放一起的都…

自動駕駛HMI產品技術方案

版本變更 序號 日期 變更內容 編制人 審核人 文檔版本 1 2 1.

【計算機網絡】13、ARP 包:廣播自己的 mac 地址和 ip

機器啟動時,會向外廣播自己的 mac 地址和 ip 地址,這個即稱為 arp 協議。范圍是未經過路由器的部分,如下圖的藍色部分,范圍內的設備都會在本地記錄 mac 和 ip 的綁定信息,若有重復則覆蓋更新(例如先收到 ma…

【Spring】深入理解 Spring 事務及其傳播機制

文章目錄 一、Spring 事務是什么二、Spring 中事務的實現方法2.1 Spring 編程式事務(手動)2.1.1 編程式事務的使用演示2.1.2 編程式事務存在的問題 2.2 Spring 聲明式事務(自動)2.2.1 Transactional 作用范圍2.2.2 Transactional …

騰訊云GPU服務器GN7實例NVIDIA T4 GPU卡

騰訊云GPU服務器GN7實例搭載1顆 NVIDIA T4 GPU,8核32G配置,系統盤為100G 高性能云硬盤,自帶5M公網帶寬,系統鏡像可選Linux和Windows,地域可選廣州/上海/北京/新加坡/南京/重慶/成都/首爾/中國香港/德國/東京/曼谷/硅谷…

安卓純代碼布局開發游戲二:Android Studio開發環境搭建

1.Android Studio下載: Download Android Studio & App Tools - Android Developers 2.安裝 安裝過程非常簡單,找到下載包,一直點Next即可。 3.下載Android SDK 第一次進入Android Studio默認會先下載Android SDK,筆者下載的Android SDK存…