QT執行緒同步與非同步處理

斷點_Dream2017發表於2020-12-04

前言:

轉載請附上連線,本帖原創請勿照抄。

 

一.執行緒分析

1.繼承QThread類

2.QObject::moveToThread

二.執行緒同步方式分析

1.互斥量(QMutex)

2.互斥鎖(QMutexLocker)

3.等待條件(QWaitCondition)

三. 說明

1.執行緒同步

2.執行緒非同步


一.執行緒分析

1.繼承QThread類

        平時我們使用執行緒的時候一般是繼承QThread類,實現它的run()函式,將需要線上程中執行的程式碼放在run()裡進行執行。

        需要注意的事項:

                如果是while迴圈,想要結束執行緒,呼叫QThread::quit是沒有用,因為這樣的執行緒根本就不需要事件迴圈,比較好的方法就是把while內的控制變數設定為false或者直接使用Qt很不推薦的方法QThread::terminate。

2.QObject::moveToThread

        因為在Qt4.3之前,run是虛擬函式,必須子類化QThread來實現run函式。而從Qt4.4開始run預設呼叫QThread::exec(),執行緒在呼叫quit()、exit()或terminate()之前不會結束。這樣一來不需要子類化QThread了,只需要例項化一個QObject就夠了,這也是推薦的方法,如果moveToThread裡執行的函式沒執行完,是無法通過quit來結束的,必須使用terminate()強制退出。

        (1)例項化一個QThread物件(qthread)。

        (2)在需要使用的地方,把QObject物件(qobj)與QThread物件(qthread)進行繫結。qobj->moveToThread(&qthread)。

        (3)給執行緒設定執行緒執行過程方法(qthreadproc),此方法定義成槽,就是你需要線上程中執行的內容。connect(&qthread,SIGNAL(started),&qobj,SLOT(qthreadproc))。qthread如果是單例,需要設定為Qt::DirectConnection,否則下次無法進入執行緒。

        (4)在需要啟動執行緒的地方執行qthread.start()就可以了。

        注:如果是誇執行緒(從執行緒到其他執行緒)執行訊號-槽傳遞自定義引數,需要用qRigisterMetaType在connect前註冊引數型別。

 

二.執行緒同步方式分析

1.互斥量(QMutex)

        標頭檔案宣告:    #include <QMutex>

        互斥量宣告:    QMutex m_Mutex;

        互斥量加鎖:    m_Mutex.lock();

        互斥量解鎖:    m_Mutex.unlock();

2.互斥鎖(QMutexLocker)

        標頭檔案宣告:    #include<QMutexLocker>

        互斥鎖宣告:    QMutexLocker mutexLocker(&m_Mutex);

        互斥鎖加鎖:    從宣告處開始(在建構函式中加鎖)

        互斥鎖解鎖:    出了作用域自動解鎖(在解構函式中解鎖)

3.等待條件(QWaitCondition)

        標頭檔案宣告:    #include <QWaitCondition>

        等待條件宣告:    QWaitCondtion m_WaitCondition;

        等待條件等待:    m_WaitConditon.wait(&m_muxtex, time);

        等待條件喚醒:    m_WaitCondition.wakeAll();

三. 說明

1.執行緒同步

推薦使用QMutexLocker互斥鎖,可以有效控制執行緒對變數的訪問線性。

2.執行緒非同步

執行緒非同步訪問,訪問速度的快慢會導致變數的不可預料性。

 

QT多執行緒相關文章:https://blog.csdn.net/qq_37529913/category_10612329.html

相關文章