QT執行緒同步與非同步處理
前言:
轉載請附上連線,本帖原創請勿照抄。
一.執行緒分析
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
相關文章
- 聊聊執行緒與程式 & 阻塞與非阻塞 & 同步與非同步執行緒非同步
- 執行緒與同步非同步執行緒非同步
- 程式與執行緒、同步與非同步、阻塞與非阻塞、併發與並行執行緒非同步並行
- 非同步/同步,阻塞/非阻塞,單執行緒/多執行緒概念梳理非同步執行緒
- 程式執行緒、同步非同步、阻塞非阻塞、併發並行執行緒非同步並行
- Java執行緒:執行緒的同步與鎖Java執行緒
- 非同步與執行緒阻塞非同步執行緒
- 併發-0-同步/非同步/阻塞/非阻塞/程式/執行緒非同步執行緒
- 執行緒同步執行緒
- 對執行緒、協程和同步非同步、阻塞非阻塞的理解執行緒非同步
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- Dart 非同步與多執行緒Dart非同步執行緒
- 執行緒同步與互斥:互斥鎖執行緒
- Python 執行緒同步與互斥Python執行緒
- java執行緒學習5——執行緒同步之同步方法Java執行緒
- c#執行緒-執行緒同步C#執行緒
- 執行緒同步及執行緒鎖執行緒
- 執行緒的同步執行緒
- 理解執行緒同步執行緒
- 深入執行緒同步執行緒
- Java—執行緒同步Java執行緒
- 多執行緒同步執行緒
- .net執行緒同步執行緒
- 執行緒同步方法執行緒
- Java之執行緒安全問題的3種處理方式(通過執行緒同步)Java執行緒
- QT中跨執行緒警告的處理QT執行緒
- 那些年搞不懂的多執行緒、同步非同步及阻塞和非阻塞(一)---多執行緒簡介執行緒非同步
- Flutter非同步與執行緒詳解Flutter非同步執行緒
- 多執行緒與併發----Semaphere同步執行緒
- 多執行緒和多執行緒同步執行緒
- Java多執行緒學習(3)執行緒同步與執行緒通訊Java執行緒
- suging閒談-netty 的非同步非阻塞IO執行緒與業務執行緒分離Netty非同步執行緒
- Java執行緒池和Spring非同步處理高階篇Java執行緒Spring非同步
- JAVA不使用執行緒池來處理的非同步的方法Java執行緒非同步
- java 多執行緒 –同步Java執行緒
- 執行緒同步機制執行緒
- java 多執行緒 --同步Java執行緒
- NPTL 執行緒同步方式執行緒