qt作為人機互動介面開發的主流工具,在工業控制領域也得到了廣泛的應用。工業控制中,需要對大量的實時資料讀取、顯示、計算和儲存,在乙個執行緒中實現這些功能,很有可能會造成介面卡死的情況。本文介紹一種不需要重寫子執行緒類的簡單方法,希望能給讀者一些啟發。初學qt,還在摸索中,所說內容難免有錯誤和不準確的地方,請大家多多指教。
編譯環境:qt5.9.8 qt creator 4.8.2 (32位)
1.在標頭檔案中宣告定時器指標變數和執行緒指標變數;
2.在建構函式中例項化時不指定父物件;
3.將定時器通過movetothread的方式轉移到子執行緒中;
4.將執行緒開啟的訊號和定時器開啟的槽函式相連;
5.將定時器和對應的槽函式相連;
6.注意:連線定時器和槽函式時,不能使用預設的連線方式,應使用qt::directconnection直接連線的方式。直接連線表示槽函式和訊號發出者處於同乙個執行緒中,只有這樣才可以完成在子執行緒中使用定時器的槽函式;
7.ps:connect第5個引數為預設的佇列方式,是為不同執行緒設計的。
**如下:
timer0 = new qtimer;
//動態分配記憶體的方法,不指定父物件
timer0thread0 = new qthread;
//動態分配記憶體,不指定父物件
timer0->
settimertype
(qt:
:precisetimer)
;//設定精確的定時器
timer0->
setinterval
(1000);
//每隔1秒觸發一次定時器
timer0->
movetothread
(timer0thread0)
;//將定時器轉移到子執行緒中
connect
(timer0thread0,
signal
(started()
),timer0,
slot
(start()
));//執行緒開啟同時啟動執行緒中的定時器
connect
(timer0,
signal
(timeout()
),this,
slot
(timer0outslot()
),qt:
:directconnection)
;//子執行緒給主線程發訊號
1.通過帶形參的訊號和槽完成執行緒間的資訊傳遞;
2.注意:在建構函式中訊號和槽函式的括號中不能寫實參,只寫變數型別就好,否則會報錯。
**如下:
connect
(this,
signal
(senddata
(const qstring)
),this,
slot
(receivedataandshow
(const qstring)))
;//通過訊號和槽的方式從子執行緒向主線程傳資料
1.cpp程式中完成程式如下:
**如下:
#include
"widget.h"
#include
"ui_widget.h"
widget:
:widget
(qwidget *parent)
:qwidget
(parent),ui
(new ui:
:widget)
widget::~
widget()
delete timer0;
delete timer0thread0;
delete ui;
}void widget:
:timer0outslot()
void widget:
:on_pushbuttonstart_clicked()
}void widget:
:on_pushbuttonstop_clicked()
}void widget:
:on_pushbuttonclear_clicked()
void widget:
:receivedataandshow
(const qstring &text)
Qt 執行緒與定時器
我寫的簡單測試 the qtimer class provides repetitive and single shot timers.上面這段話摘自qt助手文件,我們使用qtimer類定義乙個定時器,它可以不停重複,也可以只進行一次便停止。使用起來也很簡單 qtimer timer newqtim...
執行緒定時器
定時器 timer類 schedule timertask物件,時間 定時排程 時間一到,他會執行timertask物件裡面的run方法。例項 10秒後該run方法執行 public class traditionaltimertest 1 0000 這個時間也可以設定成乙個具體時間,比如幾月幾號幾...
Qt之定時器
qt中定時器的使用有兩種方法,一種是使用qobject類提供的定時器,還有一種就是使用qtimer類。定時器類qtimer提供當定時器觸發的時候發射乙個訊號的定時器,它提供只觸發一次的超時事件。1 啟動定時器 int m timerid starttimer 300 啟動乙個qtimer型別的定時器...