1. 程式人生 > 其它 >Qt多執行緒開發總覽,既然用到了就記錄一下

Qt多執行緒開發總覽,既然用到了就記錄一下

多執行緒

在LBD_VM_Intercom中使用的一個簡單的例項

陶工給的dll需要進行非同步操作才可以將視訊畫面附到窗體上,必須得在畫面出現之後才可以附加畫面,否則就有可能出現意外bug,所以需要在這個新增畫面這裡加上一個非同步操作。

Qt提供了一個非常簡單的非同步操作方法,就是可以直接把一個函式單獨拎出來放到另外一個執行緒裡面進行計算和操作,然後這個事件的處理就和當前這個事件沒有什麼關係了(如果有輸出,或者返回什麼的,還是會有,但是不會因為計算量過大而阻塞主執行緒,就比如你在主執行緒裡面寫一個死迴圈不停地算,可能ui介面會直接卡死不動,也是有可能的)。

比較簡單的方法就是:現在Qt的依賴庫中新增一個concurrent,然後在標頭檔案上加上

#include <QtConcurrent/QtConcurrent>

using namespace QtConcurrent;

這樣這個多執行緒庫就算被呼叫起來了,只需要在使用處如此宣告:

QFuture<void> future = QtConcurrent::run(JoinMeeting, sroom, sperson);

這樣這個JoinMeeting(sroom,sperson)就算是在另外一個執行緒裡進行的了,這個函式的執行就不會阻塞當前執行緒裡的程序。

淺談多執行緒

一、執行緒基礎

1、GUI執行緒與工作執行緒.

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

2、資料的同步訪問

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

二、QT多執行緒簡介

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

QT中執行緒類包含如下:

QThread 提供了跨平臺的多執行緒解決方案
QThreadStorage 提供逐執行緒資料儲存
QMutex 提供相互排斥的鎖,或互斥量
QMutexLocker 是一個輔助類,自動對 QMutex 加鎖與解鎖
QReadWriterLock 提供了一個可以同時讀操作的鎖
QReadLocker與QWriteLocker 自動對QReadWriteLock 加鎖與解鎖
QSemaphore 提供了一個整型訊號量,是互斥量的泛化
QWaitCondition 提供了一種方法,使得執行緒可以在被另外執行緒喚醒之前一直休眠。

三、QThread執行緒

1、QThread執行緒基礎

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

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

void start()函式是啟動函式,用於將執行緒入口地址設定為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子類的類名)。