真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

(73課)Qt中的多線程編程(一)

一、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

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部