Qt 在不開啟事件迴圈的執行緒中使用QTimer

2021-08-17 21:50:00 字數 1868 閱讀 4970

引入

qtimer是qt自帶的定時器類,qtimer執行時是依賴於事件迴圈的,簡單來說,在乙個不開啟事件迴圈(未呼叫exec() )的執行緒中,qtimer是無法使用的。通過分析qt原始碼可發現,呼叫qtimer::start()後僅僅是在系統的定時器向量表中新增了乙個定時器物件,但定時器並沒有真正開啟。定時器的開啟需要通過processevent()開始的一系列呼叫後才會真正得開啟,這個過程中會處理定時器向量表中所有的定時器物件。那麼實際exec()中也是在不斷地呼叫processevent()方法。

問題在專案中可能會遇到某條常駐執行緒,run()中執行著乙個處理事務的死迴圈,在死迴圈中若想直接使用qtimer來實現定時功能,那麼是不行的。我自己的的專案中是為了實現串列埠讀寫的超時判斷,所以需要用到定時器。

解決網上可以搜到解決方案,並且很好用,但是存在問題。先說一下思路:

[cpp]view plain

copy

#ifndef qcustomtimer_h

#define qcustomtimer_h

#include 

#include 

#include 

class

qcustomtimer : 

public

qobject  

;  #endif // qcustomtimer_h

[cpp]view plain

copy

[cpp]view plain

copy

#include "qcustomtimer.h"

qcustomtimer::qcustomtimer(qobject *parent) :  

qobject(parent)  

qcustomtimer::~qcustomtimer()  

void

qcustomtimer::ontimer()  

void

qcustomtimer::starttimer(

intnmsc)  

void

qcustomtimer::stoptimer()  

void

qcustomtimer::deletelater()  

[cpp]view plain

copy

#ifndef qcustomtimer_h

#define qcustomtimer_h

#include 

#include 

#include 

class

qcustomtimer : 

public

qobject  

;  #endif // qcustomtimer_h

[cpp]view plain

copy

[cpp]view plain

copy

#include "qcustomtimer.h"

qcustomtimer::qcustomtimer(qobject *parent) :  

qobject(parent)  

qcustomtimer::~qcustomtimer()  

void

qcustomtimer::ontimer()  

void

qcustomtimer::starttimer(

intnmsc)  

void

qcustomtimer::stoptimer()  

void

qcustomtimer::deletelater()  

Qt 多執行緒之逐執行緒事件迴圈

從別的執行緒中訪問qobject子類 qobject和所有它的子類是非執行緒安全的。這包括整個的事件投遞系統。需要牢記的是,當你正從別的執行緒中訪問物件時,事件迴圈可以向你的qobject子類投遞事件。假如你呼叫乙個不生存在當前執行緒中的qobject子類的函式時,你必須用mutex來保護qobje...

QT核心 生存執行緒及事件迴圈

qt最核心的兩個東西莫過於元物件和事件迴圈了,這兩個特性是日常程式設計中的兩大利器,理解和使用好這兩個特性對寫qt程式有非常大的幫助,就比如qt乙個創新功能點訊號槽就是利用這兩個特性實現 後面可能會單獨講解 我們這裡率先理解一下事件迴圈,畢竟元物件裡面有個東西也是利用事件迴圈來實現的 後面會說 生存...

Qt的事件和與Widget跨執行緒互動

一般gui的程式的模型總有至少兩個主要執行緒,乙個是介面的主事件迴圈所在的執行緒,另乙個是處理工作任務的執行緒,工作執行緒看不見,在後台處理事務產生資料,然後顯示在介面上。例如乙個即時通訊客戶端,主介面顯示好友列表,工作執行緒接受來自網路的訊息,收到訊息後,要通知介面,將對應的好友的頭像閃爍顯示。這...