天天看點

QT線程之QObjects(深入了解) 多線程的各種操作

QThread 繼承自QObject,它發射信号以訓示線程執行開始與結束,而且也提供了許多slots。更有趣的是,QObjects可以用于多線程,這是因為每個線程被允許有它自己的事件循環。

QObject 可重入性:QObject是可重入的。它的大多數非GUI子類,像QTimer,QTcpSocket,QUdpSocket,QHttp,QFtp,QProcess也是可重入的,在多個線程中同時使用這些類是可能的。需要注意的是,這些類被設計成在一個單線程中建立與使用,是以,在一個線程中建立一個對象,而在另外的線程中調用它的函數,這樣的行為不能保證工作良好。有三種限制需要注意:

1,QObject的孩子總是應該在它父親被建立的那個線程中建立。這意味着,你絕不應該傳遞QThread對象作為另一個對象的父親(因為QThread對象本身會在另一個線程中被建立)

2,事件驅動對象僅僅在單線程中使用。明确地說,這個規則适用于"定時器機制“與”網格子產品“,舉例來講,你不應該在一個線程中開始一個定時器或是連接配接一個套接字,當這個線程不是這些對象所在的線程。

3,你必須保證線上程中建立的所有對象在你删除QThread前被删除。這很容易做到:你可以run()函數運作的棧上建立對象。

本文作者原創,轉載請附上文章出處與本文連結。

跨線程的信号-槽

QObject和所有它的子類是非線程安全的。這包括整個的事件投遞系統。需要牢記的是,當你正從别的線程中通路對象時,事件循環可以向你的QObject子類投遞事件。假如你調用一個不生存在目前線程中的QObject子類的函數時,你必須用mutex來保護QObject子類的内部資料,否則會遭遇災難或非預期結果。像其它的對象一樣,QThread對象生存在建立它的那個線程中---不是當QThread::run()被調用時建立的那個線程。一般來講,在你的QThread子類中提供slots是不安全的,除非你用mutex保護了你的成員變量。

另一方面,你可以安全的從QThread::run()的實作中發射信号,因為信号發射是線程安全的。

大部分函數是非安全函數,線程涉及到互相通路請加鎖,否則會出現災難性故障。

盡管QObject是可重入的,但GUI類,特别是QWidget與它的所有子類都是不可重入的。它們僅用于主線程。正如前面提到過的,QCoreApplication::exec()也必須從那個線程中被調用。實踐上,不會在别的線程中使用GUI類,它們工作在主線程上,把一些耗時的操作放入獨立的工作線程中,當工作線程運作完成,把結果在主線程所擁有的螢幕上顯示。

QT界面UI部分不能放線上程中進行操作:

因為大部分UI庫都不支援子線程(這條是看到的,沒有實踐過)、線上程裡面new一個界面出來ui可能會接收不到系統時間、個人感覺這就像電腦為什麼有CPU、GPU、顯示卡、記憶體條、SSD、固态硬碟等差別。分離有些操作是為了更好的提高性能和流暢度。

其他文章:繼承QObject建立多線程執行個體

 多線程的各種操作

以下文章均為作者原創文章,看完記得收藏、關注加👍

線程、程序、多線程、線程池一文看懂從此秒變大佬!:https://blog.csdn.net/qq_37529913/article/details/115533429

QT 初識線程(簡單實作):https://blog.csdn.net/qq_37529913/article/details/110127940

QT QMutex使用詳解:https://blog.csdn.net/qq_37529913/article/details/110187452

QT 線程之QSemaphore(深入了解):https://blog.csdn.net/qq_37529913/article/details/110187121

QT線程 Emit、Sgnals、Slot詳細解釋:https://blog.csdn.net/qq_37529913/article/details/110211435

QT 線程之QWaitCondition(深入了解):https://blog.csdn.net/qq_37529913/article/details/110212704

Qt 多線程之線程事件循環(深入了解):https://blog.csdn.net/qq_37529913/article/details/110229382

QT線程之QObjects(深入了解):https://blog.csdn.net/qq_37529913/article/details/110228837

QT線程之可重入與線程安全(深入了解):https://blog.csdn.net/qq_37529913/article/details/110224166

QT 主線程子線程互相傳值:https://blog.csdn.net/qq_37529913/article/details/110506178

QT線程同步與異步處理:https://blog.csdn.net/qq_37529913/article/details/110521759

QT 多線程之線程池QThreadPool(深入了解):https://blog.csdn.net/qq_37529913/article/details/115536799

QT之淺拷貝、深拷貝、隐式共享(深度了解必看文章):https://blog.csdn.net/qq_37529913/article/details/110235596

QT 隐式共享機制對STL樣式疊代器的影響:https://blog.csdn.net/qq_37529913/article/details/110252454

繼續閱讀