天天看點

QT QThread 多線程操作什麼時候應該使用線程?多線程使用的風險?QT線程技術eg:如果QThread是在ui所在的線程裡生成,那麼QThread的其他非run函數都是和ui線程一樣,故這些函數應該盡量不要有太耗時的操作,而是應該将所有耗時操作放到run函數中實作。QT中使用線程的方法有兩種

在QT中,QT應用程式所在的線程為主線程,也稱為“GUI線程”,QT GUI必須運作在此線程上;而非主線程稱為“工作者線程”,主要處理從主線程中卸下的一些工作,例如資料的同步通路等。需要明确的是,同一個程序的不同線程之間共享相同的位址空間。

什麼時候應該使用線程?

如果一個應用程式需要處理一些耗時的資料計算時,應該用一個獨立線程來做這些運算,這樣使用者可以提前中斷或者暫停資料處理的工作,或者做一些和資料計算無關的工作,進而保證GUI線程或其他對時間敏感的線程保持良好的反應速度。

多線程使用的風險?

使用多線程最需要小心的就是共享資料的變動,存在于不同線程的變量很有可能被修改,難以確定其一緻性

QT線程技術
QT QThread 多線程操作什麼時候應該使用線程?多線程使用的風險?QT線程技術eg:如果QThread是在ui所在的線程裡生成,那麼QThread的其他非run函數都是和ui線程一樣,故這些函數應該盡量不要有太耗時的操作,而是應該将所有耗時操作放到run函數中實作。QT中使用線程的方法有兩種

eg:如果QThread是在ui所在的線程裡生成,那麼QThread的其他非run函數都是和ui線程一樣,故這些函數應該盡量不要有太耗時的操作,而是應該将所有耗時操作放到run函數中實作。

注意:如果在QThread的非run函數中有對QThread的某個變量進行變更,且該變量在run函數中也被用到,那需要注意上鎖的問題,因為有可能該變量在前幾毫秒就被run調用過導緻值被修改。

QT中使用線程的方法有兩種

1、使用繼承于QThread的線程

QThread 隻有run函數是在新線程裡,而其他函數都在舊線程内,Start()方法函數建立了一個新的線程并在新線程中調用重載的run()方法,是以run函數一般都需要重寫。而wait()方法被調用用來阻塞調用的線程直到run方法執行完畢。

exec()和靜态方法usleep(),msleep()和sleep()應該在新建立的線程中調用

2、繼承QObject的多線程實作

一個線程的事件循環為駐足在該線程中的所有QObjects派發了所有事件,其中包括了在這個線程中建立的所有對象。或是移植到這個線程中的對象。

QObject的線程親和性

QObject對象有一個線程親和性,即其生存在某個特定的線程中。當一個QObject對象接收到一個signal或者一個posted event時,相應的槽函數或事件處理器會在該對象所生存的線程中執行;反之如果其生存的線程沒有運作事件循環,那麼它将不能接收到signal或者event。

預設情況下,QObject對象生存在建立它的那個線程中,但是我們可以使用thread()函數來查詢對象的線程親和性,并且可以使用moveToThread()來改變一個對象的線程親和性。需要注意的是,所有對象都應該和它的父對象生存在同一個線程中。是以MoveToThread()在有父級的時候會失敗。

本文福利,莬費領取Qt開發學習資料包、技術視訊,内容包括(C++語言基礎,Qt程式設計入門,QT信号與槽機制,QT界面開發-圖像繪制,QT網絡,QT資料庫程式設計,QT項目實戰,QT嵌入式開發,Quick子產品等等)↓↓↓↓↓↓見下面↓↓文章底部點選莬費領取↓↓