Qt5多執行緒程式設計的實現

2022-09-21 08:36:12 字數 1679 閱讀 4517

目錄

每個程式啟動後擁有的第乙個執行緒稱為主線程,即gui執行緒。qt中所有的元件類和幾個相關的類只能工作在gui執行緒,不能工作在次執行緒,次執行緒即工作執行緒,主要負責處理gui執行緒卸下的工作。

每個執行緒都有自己的棧,因此每個執行緒都要自己的呼叫歷史和本地變數。執行緒共享相同的位址空間。

qt通過三種形式提供了對執行緒的支援,分別是平台無關的執行緒類、執行緒安全的事件投遞、跨執行緒的訊號-槽連線。

qt中線程類包含如下:

1、qthread執行緒基礎

qthread是qt執行緒中有乙個公共的抽象類,所有的執行緒類都是從qthread抽象類中派生的,需要實現qthread中的虛函式run(),通過start()函式來呼叫run函式。

void run()函式是執行緒體函式,用於定義執行緒的功能。

void star函式是啟動函式,用於將執行緒入口位址設定為run函式。

void terminate()函式用於強制結束執行緒,不保證資料完整性和資源釋放。

qcoreapplication::exec()總是在主線程(執行main()的執行緒)中被呼叫,不能從乙個qthread中呼叫。在gui程式中,主線程也稱為gui執行緒,是唯一允許執行gui相關操作的執行緒。另外,必須在建立乙個qthread前建立qapplication(or qcoreapplication)物件。

當執行緒啟動和結束時,qthread會傳送訊號started()和finished(),可以使用isfinished()和isrunning()來查詢執行緒的狀態。

從qt4.8起,可以釋放執行剛剛結束的執行緒物件,通過連線finished()訊號到qobject程式設計客棧::deletelater()槽。

使用wait()來阻塞呼叫的執行緒,直到其它執行緒執行完畢(或者直到指定的時間過去)。

靜態函式currentthreadid()和currentthread()返回標識當前正在執行的執行緒。前者返回執行緒的id,後者返回乙個執行緒指標。

要設定執行緒的名稱,可以在啟動執行緒之前呼叫setobjectname()。如果不呼叫setobjectname(),執行緒的名稱將是執行緒物件的執行時型別(qthread子類的類名)。

1、建立工程

2、設計ui及控制項、控制項屬性

3、新增工作執行緒

建立標頭檔案workthread.h

在右側新增如下**

#include

class workthread : public qthread

;4、新增workthread.cpp檔案

在右側新增如下**:

重寫run()函式

重寫run()函式

#include "workthread.h"

#include

workthread::workthread()

void workthread::run()

for ( int i = 0; i < maxsize; i++ )

ui->startbtn->setenabled(false);

ui->stopbtn->setenabled(true);

}void threaddlg::slotstop()

ui->startbtn->setenablwww.cppcns.comed(true);

ui->stopbtn->setenabled(false);

}void threaddlg::slotexit()

執行效果

Qt5多執行緒退出

在使用qt開發介面的工作中幾乎無法避免對資料的處理,那我們第一想到的是將資料處理部門放到子執行緒,那麼就有了這樣的問 題 如何正確的結束資料處理執行緒?在qt5以後,官方也推薦使用了一種子執行緒工作的方式 void qobject movetothread qthread targetthread ...

QT5程式設計小記

1.今天在用qt寫串列埠小例項的時候碰到qt5 c2001 常量中有換行符等問題,因為是qt5,很多qt4的解決方案是無效的的。解決方案 用記事本開啟你的cpp檔案,另存為utf8格式 2.之前一直使用qdebug qstring 串列埠開始寫資料 後台列印一直亂碼 解決方案 qdebug qstr...

Qt5發生的變化 Qt5程式設計入門筆記

2 qt5移除了qt opengl模組,將opengl相關的類移動到了qt gui模組中,意味著opengl成為了每個應用程式的必選項。3 qt5吧全部的qt介面遷移到qt平台抽象層 qt platform abstraciton qpa 智商,使得qt能更容易地移植到另外的系統和裝置上。4 qt5...