一、Qt中通過QThread直接支持多線程
創(chuàng)新互聯(lián)公司是專業(yè)的硚口網(wǎng)站建設公司,硚口接單;提供成都網(wǎng)站建設、網(wǎng)站制作,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行硚口網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
1、QThread是一個跨平臺的多線程解決方案
2、QThread以簡潔易用的方式實現(xiàn)多線程編程
注意:1、Qt中的線程以對象的形式被創(chuàng)建和使用
2、每一個線程對應著一個QThread對象
QThread這個類,是一個線程父類,我們需要繼承這個QThread類。
QThread類,提供了一組成員函數(shù)。一個線程是以一個對象的形式來表現(xiàn)出來,所以說,我們創(chuàng)建一個
線程的時候,實際上就是創(chuàng)建了一個這個QThread線程類的對象
一個線程對應一個QThread對象
二、QThread中的關鍵成員函數(shù)
1、void run()
線程體函數(shù),用于定義線程功能(執(zhí)行流),是線程的入口函數(shù)。
2、void start()
啟動函數(shù),在操作系統(tǒng)中真正創(chuàng)建出一個線程后,將線程入口地址設置為run函數(shù)
3、void terminate()
強制結束線程(不推薦)
三、自定義一個線程類
class MyThread : public QThread { protected: //保護,被保護的成員函數(shù),不能直接被外界訪問,但是可以被子類直接訪問 void run() //重寫QThread類中的run成員函數(shù),來實現(xiàn)我們線程體邏輯 { for ( int i = 0; i < 5; i++) { qDebug() << objectName() <可以說是三個線程上面的,因為還包含了主線程,三個線程是并行執(zhí)行的。宏觀上。
注意:上面代碼,主線程將先于子線程結束,所有子線程全部結束后,進程結束。
一個進程的結束,要等待內部的所有線程都結束后,才會結束。
四、線程的生命周期
1、用線程類創(chuàng)建一個對象時,可以說我們已經(jīng)創(chuàng)建一個線程了,被創(chuàng)建的線程對象
調用start成員函數(shù)后,線程開始運行,運行的是run成員函數(shù)體,該線程參與操作
系統(tǒng)的調度,操作系統(tǒng)給每一個線程一定的時間片時間去執(zhí)行,時間片到了當前線程
停止運行,其他線程運行它的時間片,如此調度,所以從單核cpu的角度看,微觀看,線程
是順序執(zhí)行,由操作系統(tǒng)切換每個線程的執(zhí)行。線程的非正常死亡之一是因terminate()
成員函數(shù)導致,所以terminate成員函數(shù)不推薦使用,因為不會考慮數(shù)據(jù)的完整性,
會暴力的殺死線程,可能會導致資源沒有被釋放,數(shù)據(jù)不完整等,所以在工程中
禁止調用。
2、不調用terminate()成員函數(shù)去結束一個線程,那如何優(yōu)雅的結束一個線程的生命期呢?
(1)解決方案思路:
run()函數(shù)執(zhí)行結束是優(yōu)雅終止線程的唯一方式,因為是線程的自然死亡,run成員函數(shù)被執(zhí)行完了
run成員函數(shù)被正常的返回了,這種叫做正常的死亡,所以在線程類中增加一個標志變量m_toStop(volatile bool),通過m_toStop的值判斷是否需要從run()函數(shù)返回。run函數(shù)返回,為優(yōu)雅
的結束線程 。volatile關鍵字必須去修飾這個標志變量,不需要編譯去優(yōu)化,而是我們每次都會去內存中去取這個值,值是易變的,所以加volatile。
3、代碼如下
class MyThread :public QThread { protected: volatile bool m_toStop; void run(); public: MyThread() { m_toStop = false; } void stop() { m_toStop = true; } }; void MyThread::run() { while (!m_toStop) { } }上面的代碼,如果run函數(shù)中的while循環(huán)中,判斷到了m_toStop變量值為true了,
則會不執(zhí)行while循環(huán),跳出while循環(huán),向下執(zhí)行后,run函數(shù)就會自己返回,這個
方法是工程中,結束一個線程執(zhí)行的一個很好的方法,標準優(yōu)雅的去結束一個線程。
class MyThread :public QThread { protected: volatile bool m_toStop; void run() { int *p = new int[10000]; //申請了10000*int大小的堆空間讓p指向 for ( int i = 0; !m_toStop && (i < 10); i++ ) { p[i] = i * i; sleep(1); } delete[] p; } public: MyThread() { m_toStop = false; } void stop() { m_toStop = true; } };int main(void)
{
MyThread t;
t.start();
Sleep(5000);
t.stop(); //優(yōu)雅的結束線程
}
本文名稱:(73課)Qt中的多線程編程(一)
網(wǎng)站路徑:http://weahome.cn/article/poiggp.html