Qt 異步實現事件的定時執行 - QTimer和QThread的聯合使用

異步實現事件的定時執行 - QTimer和QThread的聯合使用

  • 引言
  • 一、核心源碼
  • 二、其信號和槽函數簡述
  • 三、定時器及其moveToThread簡述

引言

在 Qt 中,如果想要定時執行某些事件或函數,通常會使用 QTimer 類。QTimer 允許設置一個時間間隔,當這個時間間隔過去后,它會發出一個信號。可以將這個信號連接到一個槽函數,從而在該時間間隔到達時執行特定的操作。如果想要實現定時的操作是異步執行 (不阻塞主線程),可通過moveToThread將定時器移動到一個線程中,信號和槽的連接類型使用Qt::DirectConnection,保證槽函數執行是在定時器的線程中。效果如下圖所示 (一秒執行一次):

在這里插入圖片描述

一、核心源碼

    1. 創建定時器以及線程,設定執行事件
    this->m_timer = new QTimer(nullptr);this->m_thread = new QThread(this);m_timer->setInterval(1000);m_timer->moveToThread(m_thread);connect(m_timer, &QTimer::timeout, this, [&](){QString time = QDateTime::currentDateTime().toString("hh:mm:ss.zzz");qDebug()<< time << " timer Thread ID:" << QThread::currentThreadId();}, Qt::DirectConnection);connect(m_thread, &QThread::started, m_timer, QOverload<>::of(&QTimer::start));connect(m_thread, &QThread::finished, m_timer, &QTimer::stop);m_thread->start();qDebug() << "Main Thread ID:" << QThread::currentThreadId();

首先創建定時器和線程,設定定時器間隔時間為1秒,并將定時器移動到線程中。方便起見直接使用蘭姆達表達式設定定時器的定時槽函數. 使用信號和槽的形式調用定時器相關函數 (開始和停止)。最后啟動線程即可.

    1. 內存釋放
    m_thread->quit();m_thread->wait();m_thread->deleteLater();m_timer->deleteLater();

一般在父類或者父窗體的析構函數中執行,停止執行,釋放內存。

二、其信號和槽函數簡述

信號與槽相關知識可參考:
Qt 信號與槽的使用詳解 - 多種綁定形式、同步異步、Lambda表達式等:https://blog.csdn.net/qq_38204686/article/details/139702275

    1. 使用信號和槽的形式調用定時器相關函數
      由于定時器已經被移動到線程中,所以不能直接在主線程中調用定時器相關函數。比如執行定時器停止m_timer->stop();會顯示QObject::killTimer: Timers cannot be stopped from another thread

可參考
Qt: QTimer和QThread:https://www.cnblogs.com/lingdhox/p/4218051.html
https://stackoverflow.com/questions/53200294/qthread-with-qtimer-connection-issues

    1. 定時器開始槽函數需使用QOverload<>::of重載
      &QTimer::start有多個重載函數,比如void QTimer::start(int msec)void QTimer::start(),需使用QOverload<>::of指定調用哪一個重載函數 - (在<>中指明參數,比如<int>)。
      如果只這樣寫connect(m_thread, &QThread::started, m_timer, &QTimer::start);會報錯,
      這樣connect(m_thread, SIGNAL(started()), m_timer, SLOT(start()));是可行的,但不建議。

可參考
QThread with QTimer connection issues:https://stackoverflow.com/questions/53200294/qthread-with-qtimer-connection-issues
QT-信號槽有多個重載版本{ QOverload<_>::of(&::) }:https://blog.csdn.net/ugetoneshot/article/details/139169027

三、定時器及其moveToThread簡述

    1. 創建定時器new QTimer(nullptr) 參數parent為空而不是this
      后續需要將定時器移動到另一線程,所以其父對象需為空

void QObject::moveToThread(QThread *targetThread)的官方解釋:
更改此對象及其子對象的線程相關性。如果對象有父對象,則無法移動該對象,事件處理將在targetThread中繼續。使用時需注意:此函數只能將對象從當前線程“推”到另一個線程,而不能將對象從任意線程“拉”到當前線程。

    1. 關于定時器的精度問題.
      如下方左圖所示,近似每秒一觸發,但是誤差在2-3毫秒,設置setTimerType(Qt::PreciseTimer);之后誤差只有1毫秒。

在這里插入圖片描述 在這里插入圖片描述

可參考
QT使用高精度定時器:https://blog.csdn.net/ljjjjjjjjjjj/article/details/130189550

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

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

相關文章

echarts使用自定義圖形實現3D柱狀圖

先看下效果吧 實現思路 使用graphic創建并注冊自定義圖形。根據每組的數據值&#xff0c;得到一個對應的點&#xff0c;從點出發用canvas繪制一組圖形&#xff0c;分別為 頂部的菱形 const CubeTop echarts.graphic.extendShape({buildPath: function (ctx, shape) {const c1…

c++ primer plus 第15章友,異常和其他,15.3.8exception 類

c primer plus 第15章友&#xff0c;異常和其他,15.3.8exception 類 15.3.8exception 類 文章目錄 c primer plus 第15章友&#xff0c;異常和其他,15.3.8exception 類15.3.8exception 類1.stdexcept異常類3.空指針和 new 15.3.8exception 類 C異常的主要目的是為設計容錯程序…

NVIDIA良心給顯卡免費升級,只為挨更多的罵

起猛了&#xff0c;還真的以為 NVIDIA 良心發現了。 眾所周知&#xff0c;英偉達對于咱們普通游戲玩家向來不屑一顧。只因為游戲業務在 NVIDIA 收入中占比較少。 在最新的 40 系顯卡 RTX 4070 Ti Super 顯卡中&#xff0c;NVIDIA悄悄給它來了一次核心「升級」&#xff0c;將原…

ARM學習(29)NXP 雙coreMCU IMX1160學習----NorFlash 啟動引腳選擇

ARM學習&#xff08;28&#xff09;NXP 雙coreMCU IMX1160學習----NorFlash 啟動引腳選擇 1、多種啟動方式介紹 IMX1166 支持多組flexSPI 引腳啟動&#xff0c;FlexSPI1以及FlexSPI2&#xff0c;通過boot cfg可以切換FlexSPI得實例。 每個實例又支持多組引腳&#xff0c;總共…

Subclass-balancing Contrastive Learning for Long-tailed Recognition

Subclass-balancing Contrastive Learning for Long-tailed Recognition 核心公式解析溫度參數 τ \tau τ的作用公式5解析 核心公式解析 L S B C L ? ∑ i 1 N ( 1 ∣ M ~ i ∣ ∑ z p ∈ M ~ i log ? exp ? ( z i ? z p ? / τ 1 ) ∑ z a ∈ V ~ i exp ? ( z i ? z…

LiteOS增加執行自定義源碼

開發過程注意事項&#xff1a; 源碼工程路徑不能太長 源碼工程路徑不能有中文 一定要關閉360等殺毒軟件&#xff0c;否則編譯的打包階段會出錯 增加自定義源碼的步驟: 1.創建源碼目錄 2. 創建源文件 新建myhello目錄后&#xff0c;再此目錄下再新建源文件myhello_demo.c 3. 編…

程序員學長 | PyCaret,一個超強的 python 庫

本文來源公眾號“程序員學長”&#xff0c;僅用于學術分享&#xff0c;侵權刪&#xff0c;干貨滿滿。 原文鏈接&#xff1a;PyCaret&#xff0c;一個超強的 python 庫 今天給大家分享一個超強的 python 庫&#xff0c;PyCaret。 https://github.com/pycaret/pycaret 簡介 …

[論文筆記]RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL

引言 今天帶來又一篇RAG論文筆記&#xff1a;RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL。 檢索增強語言模型能夠更好地適應世界狀態的變化并融入長尾知識。然而&#xff0c;大多數現有方法只能從檢索語料庫中檢索到短的連續文本片段&#xff0…

random.choices 的參數及其應用

random.choices 是 Python 的 random 模塊中的一個函數&#xff0c;用于從給定的序列中隨機選擇元素&#xff0c;可以設置權重。這個函數在需要根據特定概率分布進行隨機選擇的場景中非常有用。下面是 random.choices 的參數及其詳細介紹&#xff1a; 文章目錄 參數應用示例基本…

釋放序列和同步

#include <iostream> #include<thread> #include<atomic> #include<vector> std::atomic<int>count(0); std::vector<int>queue_data; //如果存儲操作被標記為memory_order_release、memory_order_acq_rel或memory_order_seq_cst&#xff…

FP5207+音頻功率放大器的組合解決方案-適用于便攜式音頻播放器、無線耳機、智能音箱和車載音響系統等高質量音頻輸出需求的產品,以提高電池供電的效率和輸出功率

隨著消費者對智能家居的需求增長&#xff0c;智能音響市場成為重要增長點。同時&#xff0c;音響技術也在不斷發展&#xff0c;音響及揚聲器的功能和性能不斷提升。 藍牙音箱&#xff0c;這類音箱供電是以鋰電池為主&#xff0c;一般選用內置升壓的音頻功放芯片&#xff0c;音響…

iOS input 標簽 focus 失效

解決方案 <inputv-if"show"ref"inputRef" />watch(inputRef, (ref) > {ref?.focus(); });

vivado DQS_BIAS

DQS_偏差 DQS_BIAS是驅動差分輸入緩沖器的頂級端口的屬性&#xff0c;或者 雙向緩沖基元&#xff08;IBUFDS、IOBUFDS&#xff09;。 DQS_BIAS屬性在某些的輸入端提供可選的DC偏置 偽差分I/O標準&#xff08;DIFF_SSTL&#xff09;和真差分I/O規范&#xff08;LVDS&#xff09;…

windows 構建nginx本地服務隨系統自啟

1.先去官網下載一個nginxzip 2.將zip解壓&#xff0c;將nginx-server.exe文件放入文件夾 3.創建nginx-server.xml&#xff0c;將以下內容放進文件內 <service> <id>nginx</id> <name>Nginx Service</name> <description>High Per…

強化學習中的蒙特卡洛算法和時序差分算法

在強化學習&#xff08;Reinforcement Learning, RL&#xff09;中&#xff0c;價值函數的估計是核心任務之一。蒙特卡洛&#xff08;Monte Carlo, MC&#xff09;方法和時序差分&#xff08;Temporal Difference, TD&#xff09;方法是兩種常用的策略&#xff0c;用于估計狀態…

軟件架構之架構風格

軟件架構之架構風格 9.3 軟件架構風格9.3.1 軟件架構風格分類9.3.2 數據流風格9.3.3 調用/返回風格9.3.4 獨立構件風格9.3.5 虛擬機風格9.3.6 倉庫風格 9.4 層次系統架構風格9.4.1 二層及三層 C/S 架構風格9.4.2 B/S 架構風格9.4.3 MVC 架構風格9.4.4 MVP 架構風格 9.5 面向服務…

機器學習筑基篇,?Ubuntu 24.04 編譯安裝 Python 及多版本切換

[ 知識是人生的燈塔&#xff0c;只有不斷學習&#xff0c;才能照亮前行的道路 ] Ubuntu 24.04 編譯安裝最新Python及多版本切換 描述&#xff1a;說到機器學習&#xff0c;人工智能&#xff0c;深度學習不免會提到Python這一門編程語言&#xff08;人生苦短&#xff0c;及時Pyt…

windows防火墻端口設置

PS&#xff1a;本文實例為Windows Server 2019&#xff0c;其他Windows版本大同小異。 1、首先打開windows防火墻&#xff0c;點擊“高級設置” 2、 高級設置界面 3、假設需要開放一個端口為3306應該怎么做 光標對準“入站規則”右鍵新建規則&#xff0c;選擇“端口” 協議這…

C++類和對象(一)

目錄 面向過程和面向對象 面向過程編程&#xff08;Procedural Programming&#xff09; 面向對象編程&#xff08;Object-Oriented Programming&#xff09; 一、類的定義 類定義格式 類域 二、類的訪問限定符及封裝 訪問限定符 封裝 三、實例化 實例化概念 對象大小…

軟件運行次數

題目&#xff1a; 實現一個驗證程序運行次數的小程序&#xff0c;要求如下&#xff1a; 當程序運行超過3次時給出提示&#xff1a;本軟件只能免費使用3次&#xff0c;歡迎您注冊會員后繼續使用&#xff5e;程序運行演示如下&#xff1a; 第一次運行控制臺輸出&#xff1a;歡迎…