国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

QT創(chuàng)建線程的方法:一步步教你創(chuàng)建和啟動(dòng)線程

這篇具有很好參考價(jià)值的文章主要介紹了QT創(chuàng)建線程的方法:一步步教你創(chuàng)建和啟動(dòng)線程。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

線程概念及官方文檔

?一、線程的創(chuàng)建:繼承方式

二、線程的創(chuàng)建:QObject 對(duì)象(moveToThread)

2.1 創(chuàng)建任務(wù)類

2.2 添加線程啟動(dòng)(定時(shí)器啟動(dòng))

2.3?添加線程啟動(dòng)(start信號(hào)啟動(dòng))

三、線程類的基本接口和使用

3.1啟動(dòng) 和終止線程

3.2 線程延遲

3.3 線程同步及通信方式

3.4 常用函數(shù)例舉

四、線程釋放

五、總結(jié)

線程概念及官方文檔

????????線程(英語(yǔ):thread)是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)。在Unix System V及SunOS中也被稱為輕量進(jìn)程(lightweight processes),但輕量進(jìn)程更多指內(nèi)核線程(kernel thread),而把用戶線程(user thread)稱為線程。這段話摘之網(wǎng)絡(luò)。

????????從下面的官方文檔可以看出,如果一個(gè)線程類要支持信號(hào)和槽,那么,該類要直接或者間接的繼承于QObject類,并且在類中要聲明宏:Q_OBJECT

????????好了,不說概念了,不喜歡說概念,直接開始說干貨。

qt 創(chuàng)建線程,QT開發(fā),c++,qt,windows

?一、線程的創(chuàng)建:繼承方式

線程的創(chuàng)建方式:自定義一個(gè)類繼承于QThread,并且 重寫該類的run函數(shù),run函數(shù)中,就是 子線程要執(zhí)行任務(wù)。在創(chuàng)建線程后,要進(jìn)行啟動(dòng)線程 操作,下面是例子

class WorkerThread : public QThread
{
      
      void run() override { 
          while(1){
              qDebug()<<"hello";
              QThread::sleep(1);
            }
      }
 
};

運(yùn)用的話簡(jiǎn)單,舉個(gè)例子,就能看到一秒中輸出一次 hello

 WorkerThread *workerThread = new WorkerThread(this);
 workerThread->start();//子線程要調(diào)用start啟動(dòng),否則,不會(huì)執(zhí)行

注意事項(xiàng):

? ? ? 1. 默認(rèn)情況下,void run() 只執(zhí)行一次,想要執(zhí)行多次,要手動(dòng)使用循環(huán)語(yǔ)句

? ? ? 2.?子線程一定要調(diào)用start啟動(dòng),否則,不會(huì)執(zhí)行

? ? ? 3.要想實(shí)現(xiàn)和其他線程通信,可使用信號(hào)的方式進(jìn)行通信,后面我上傳 緩沖區(qū)那篇文章會(huì)用到。

? ? ?實(shí)現(xiàn)的步驟基本就是

1.創(chuàng)建一個(gè)子類繼承于QThread,并且重寫run函數(shù)
2.創(chuàng)建子線程對(duì)象
3.啟動(dòng)子線程 ---- start()

二、線程的創(chuàng)建:QObject 對(duì)象(moveToThread)

這種方式我重點(diǎn)講,前面的方式對(duì)于我來說,沒有這種方式好用,在開發(fā)中,我經(jīng)常用這種方式。

步驟分為三步,第一步創(chuàng)建用于運(yùn)行任務(wù)的類,第二步創(chuàng)建線程,并在類中添加線程,第三步啟動(dòng)

下面講一下詳細(xì)步驟。

2.1 創(chuàng)建任務(wù)類

創(chuàng)建一個(gè)類繼承于QObject,并且聲明Q_OBJECT,這是規(guī)定的。定義一個(gè)槽函數(shù),用于線程的執(zhí)行。下面用代碼演示一下

class threadhid : public QObject
{
    Q_OBJECT
public:
    explicit threadhid(QObject *parent = nullptr);
    ~threadhid();
  void stopRun(void);   //用于退出
 
public:
   bool m_Run ;      //退出線程的標(biāo)志位

public slots:
  void Receive();    //用于線程循環(huán)

};

函數(shù)實(shí)現(xiàn):

這是最簡(jiǎn)單的模板,具體的功能可以自己添加上去。簡(jiǎn)單說明一下參數(shù),m_Run標(biāo)志位是為了更好的退出這個(gè)槽函數(shù),再釋放線程。stopRun()函數(shù)是可以通過類接口進(jìn)行釋放線程,更加安全,不會(huì)隨意退出,更好管理。

threadhid::threadhid(QObject *parent ): QObject(parent)
{
   
}
threadhid::~threadhid()
{

}
void threadhid::stopRun(void)
{
    m_bRun = false;
}
void threadhid::Receive()
{
     
      m_Run = true;
      while(true) {


          if(!m_Run)
          {
             qDebug()<<"退出";
             break;
          }
   
           QThread::msleep(200);
           qDebug()<<"hello 大寶犯疆土...";
              
      }

}

2.2 添加線程啟動(dòng)(定時(shí)器啟動(dòng))

?上面是創(chuàng)建任務(wù),現(xiàn)在是給與這個(gè)類一個(gè)線程,達(dá)到分離的效果。

??第一步創(chuàng)建類線程

?QThread * thread_Hid = new QThread;? ? ? ? ?
??第二步創(chuàng)建任務(wù)類
?threadhid* ?USB_Handle = new threadhid() ; ?//創(chuàng)建任務(wù)類

第三步添加到線程中

USB_Handle->moveToThread(&thread_Hid);?

第四步?線程釋放 ?

?connect(&thread_Hid, &QThread::finished, USB_Handle, &QObject::deleteLater);

注:這段代碼是用于連接一個(gè)線程對(duì)象 thread_Hid 的 finished() 信號(hào)和一個(gè) QObject 對(duì)象 USB_Thread 的 deleteLater() 槽函數(shù)的。 在多線程編程中,線程的生命周期可能會(huì)比較復(fù)雜,如果沒有正確地管理線程的生命周期,就可能會(huì)導(dǎo)致內(nèi)存泄漏或者程序崩潰等問題。因此,Qt 提供了一些機(jī)制來幫助管理線程的生命周期,其中之一就是通過在線程結(jié)束時(shí)自動(dòng)刪除線程對(duì)象來確保線程對(duì)象的正確釋放。 在上述代碼中,當(dāng) thread_Hid 線程結(jié)束時(shí),就會(huì)發(fā)出 finished() 信號(hào),這個(gè)信號(hào)被連接到 USB_Thread 對(duì)象的 deleteLater() 槽函數(shù)上,這樣當(dāng)線程結(jié)束時(shí),就會(huì)自動(dòng)調(diào)用 USB_Thread 對(duì)象的 deleteLater() 槽函數(shù),從而保證線程對(duì)象的正確釋放。 需要注意的是,當(dāng)使用 QObject::deleteLater() 槽函數(shù)時(shí),要確保所要?jiǎng)h除的對(duì)象是在其所屬線程的事件循環(huán)中被創(chuàng)建的,否則 deleteLater() 函數(shù)可能不會(huì)生效。

第五步 線程啟動(dòng)

thread_Hid.start();

第六步 創(chuàng)建單次定時(shí)器啟動(dòng)線程任務(wù)

timerHid = new QTimer(this);

connect(timerHid, &QTimer::timeout, USB_Handle, &threadhid::Receive);

timerHid->setSingleShot(true);

timerHid->start(1000);

為了方便大家復(fù)制和我以后某一天想起,直接貼完整代碼

 threadhid*  USB_Handle = new threadhid() ;  
 
 QThread * thread_Hid = new QThread;   //線程
   USB_Handle->moveToThread(&thread_Hid);添加到線程中
   //線程釋放
   connect(&thread_Hid, &QThread::finished, USB_Handle, &QObject::deleteLater);
     
   thread_Hid.start();//線程啟動(dòng)
   
   //定時(shí)器單次運(yùn)行
    timerHid = new QTimer(this);
     connect(timerHid, &QTimer::timeout, USB_Handle, &threadhid::Receive);
     timerHid->setSingleShot(true);
     timerHid->start(1000);

2.3?添加線程啟動(dòng)(start信號(hào)啟動(dòng))

為什么說這個(gè)呢,就是想簡(jiǎn)單的記錄一下多種啟動(dòng)方式,上面的那種是我自己用的,我覺得可以讓時(shí)間更加可靠,而下面這種是一啟動(dòng)就運(yùn)行的。2.3和2.2效果是一樣,不用重復(fù)寫。

connect(thread_Hid, &QThread::started, USB_Handle, &threadhid::Receive); // 連接線程槽

thread_Hid->start();? ? ? ?//啟動(dòng)

三、線程類的基本接口和使用

3.1啟動(dòng) 和終止線程

3.1.1退出線程

void?quit() //退出一個(gè)線程循環(huán),可以起作 停止線程

3.1.2 啟動(dòng)線程

start(QThread::Priority priority = InheritPriority)//啟動(dòng)線程

3.1.3 退出線程

terminate()//終止線程

區(qū)別:

terminate() 函數(shù)是一個(gè)強(qiáng)制終止程序的函數(shù),它可以立即終止應(yīng)用程序并釋放相關(guān)資源,但這種方式可能會(huì)導(dǎo)致一些未定義的行為,例如可能會(huì)導(dǎo)致未處理的異常和內(nèi)存泄漏等問題。因此,建議只在出現(xiàn)緊急情況時(shí)使用 terminate() 函數(shù)。

quit() 函數(shù)是一個(gè)優(yōu)雅地終止程序的函數(shù),它會(huì)告訴事件循環(huán)停止運(yùn)行,并等待所有線程結(jié)束后再退出應(yīng)用程序。它會(huì)釋放所有的資源,包括 GUI 界面等。因此,建議在正常情況下使用 quit() 函數(shù)來終止應(yīng)用程序。

3.2 線程延遲

qt 創(chuàng)建線程,QT開發(fā),c++,qt,windows

3.3 線程同步及通信方式

同步機(jī)制的目的是為了保護(hù)數(shù)據(jù)或者代碼段,在多線程中,每次只允許一個(gè)線程來進(jìn)行訪問。線程同步方式:互斥鎖 讀寫鎖 信號(hào)量等

QMutex、QMutexLocker, QReadWriteLock, QSemaphore, and QWaitCondition.具體用法就不說了,復(fù)制一下百度,這次重點(diǎn)介紹線程。

通信方式:

1.信號(hào)和槽?

2.QMetaObject::invokeMethod():可以在不同線程之間異步地調(diào)用一個(gè)函數(shù),實(shí)現(xiàn)線程間的通信。

3.QThread::event()和QCoreApplication::postEvent():可以用于在線程之間發(fā)送事件和處理事件。

3.4 常用函數(shù)例舉

  1. start() 函數(shù):用于啟動(dòng)線程,它會(huì)調(diào)用線程的 run() 函數(shù),并將線程標(biāo)記為“運(yùn)行中”。

  2. run() 函數(shù):是線程的主函數(shù),可以在該函數(shù)中執(zhí)行需要在線程中運(yùn)行的代碼。

  3. wait() 函數(shù):用于等待線程結(jié)束,它會(huì)使當(dāng)前線程阻塞,直到目標(biāo)線程結(jié)束為止。

  4. quit() 函數(shù):用于終止線程,它會(huì)發(fā)送一個(gè)退出信號(hào)給線程,并等待線程結(jié)束后才返回。

  5. isRunning() 函數(shù):用于檢查線程是否正在運(yùn)行中。

  6. setPriority() 函數(shù):用于設(shè)置線程的優(yōu)先級(jí),Qt 支持以下幾種優(yōu)先級(jí):IdlePriority、LowestPriority、LowPriority、NormalPriority、HighPriority、HighestPriority、TimeCriticalPriority。

  7. sleep() 函數(shù):用于使當(dāng)前線程睡眠一段時(shí)間,單位是毫秒。

  8. msleep() 函數(shù):用于使當(dāng)前線程睡眠一段時(shí)間,單位是微秒。

  9. yieldCurrentThread() 函數(shù):用于將 CPU 時(shí)間讓給其他線程。

  10. currentThreadId() 函數(shù):用于獲取當(dāng)前線程的 ID。

  11. event() 函數(shù):用于處理事件,QThread 中的事件有兩種:QThread::CustomEventType 和 QThread::Quit。

  12. exit() 函數(shù):用于退出線程,并釋放線程所占用的資源。

  13. finished() 信號(hào):當(dāng)線程結(jié)束時(shí)會(huì)發(fā)出該信號(hào),可以通過該信號(hào)來實(shí)現(xiàn)線程的清理工作。

需要注意的是,在多線程編程中,要避免使用一些不安全的操作,如訪問全局變量、使用未初始化的指針、使用不可重入的函數(shù)等,否則可能會(huì)導(dǎo)致程序出現(xiàn)不可預(yù)知的錯(cuò)誤。在多線程編程中需要特別注意線程安全問題。

四、線程釋放

線程的釋放也是跟重要的,作為一個(gè)合格的工程師不能只管申請(qǐng)不管釋放,有始有終對(duì)吧。

第一步釋放類內(nèi)資源,并退出死循環(huán)

第二步退出事件循環(huán)

第三步等待線程退出

第四步釋放內(nèi)存

    USB_Handle->stopRun(); //先退出死循環(huán) m_Run = false;
    thread_Hid.quit(); //退出事件循環(huán)
    thread_Hid.wait(); //等待線程退出
   // QThread::terminate()//也可以,但是上面的方式更加溫柔

    delete  thread_Hid;
    delete USB_Handle ;

大功告成。

五、總結(jié)

  • QThread 可以通過繼承 QThread 類并重寫 run 函數(shù)來實(shí)現(xiàn)自定義線程類。
  • QThread 還提供了信號(hào)槽機(jī)制,使得線程之間的通信更加方便。
  • QThread 通過 exec 函數(shù)實(shí)現(xiàn)事件循環(huán),當(dāng)線程沒有事件時(shí),exec 函數(shù)會(huì)阻塞線程。

注意事項(xiàng):

  • QThread 中創(chuàng)建的對(duì)象默認(rèn)情況下都會(huì)與 QThread 線程關(guān)聯(lián),應(yīng)該使用 moveToThread 函數(shù)將其移動(dòng)到新的線程中。
  • 不應(yīng)該直接調(diào)用 QThreadrun 函數(shù),應(yīng)該通過 start 函數(shù)來啟動(dòng)線程。
  • QThread 對(duì)象應(yīng)該在主線程中創(chuàng)建,并且只能在主線程中刪除。
  • 為了避免資源泄露,應(yīng)該在線程執(zhí)行完畢后將其刪除。

Qt線程的總結(jié)暫時(shí)就這么多,我寫的博客偏向于實(shí)際應(yīng)用型,概念不多強(qiáng)調(diào),只為更加方便的使用,減少?gòu)U話。如果本篇給與你開發(fā)或多或少的幫助,希望可以給個(gè)點(diǎn)贊激勵(lì)一下哈。文章來源地址http://www.zghlxwxcb.cn/news/detail-538533.html

到了這里,關(guān)于QT創(chuàng)建線程的方法:一步步教你創(chuàng)建和啟動(dòng)線程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Qt進(jìn)行UDP通訊,創(chuàng)建一個(gè)收線程這樣可以進(jìn)行接收數(shù)據(jù)

    Qt進(jìn)行UDP通訊,創(chuàng)建一個(gè)收線程這樣可以進(jìn)行接收數(shù)據(jù)

    在.pro中增加一句話 繪制界面 .h文件內(nèi)容: 構(gòu)造函數(shù)內(nèi)容 對(duì)于綁定按鈕的定義函數(shù): 接收信號(hào)的槽函數(shù)(UDP接收到數(shù)據(jù)顯示) quitThreaSlot函數(shù): 退出按鈕定義: 使用的receivethread.h就是將run函數(shù)重寫(循環(huán)發(fā)送定義的信號(hào)延遲即可),在定義一個(gè)信號(hào)即可。 以上即功能的所有

    2024年02月20日
    瀏覽(31)
  • C++ Qt開發(fā):運(yùn)用QThread多線程組件

    C++ Qt開發(fā):運(yùn)用QThread多線程組件

    Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫(kù),利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹如何運(yùn)用 QThread 組件實(shí)現(xiàn)多線程功能。 多線程技術(shù)在程序開發(fā)中尤為常用,Q

    2024年03月09日
    瀏覽(52)
  • 【Qt】QThread & moveTothread-多線程的兩種實(shí)現(xiàn)方法

    【Qt】QThread & moveTothread-多線程的兩種實(shí)現(xiàn)方法

    一、如何理解多線程 二、實(shí)現(xiàn)多線程的兩種方式(面向應(yīng)用) 2.1 繼承 QThread 的類 2.2 (推薦這種方式)函數(shù) moveTothread() 三、多線程的釋放問題(善后工作) 類似我們單片機(jī)的編程,如在 Keil5 中對(duì) 51 單片機(jī)或者 STM32 單片機(jī)進(jìn)行編程時(shí),如果我們使用模塊化編程,那么 main.c 文

    2024年02月01日
    瀏覽(18)
  • 【QT】C++和QML使用多線程優(yōu)化界面切換卡頓的方法

    【QT】C++和QML使用多線程優(yōu)化界面切換卡頓的方法

    qt提供了一種聲明式語(yǔ)言qml,可以使用一些可視組件以及這些組件之間的交互來描述用戶界面,而c++可以只負(fù)責(zé)后臺(tái)邏輯的處理,將界面和后臺(tái)分離開來,由qml來做UI界面,c++負(fù)責(zé)后端處理,對(duì)我個(gè)人來說,這樣的方式大大的方便了對(duì)界面和邏輯的修改和維護(hù); 由于UI界面是工

    2024年01月19日
    瀏覽(20)
  • 一步步教你在 Windows 上構(gòu)建 dotnet 系應(yīng)用的 UOS 軟件安裝包

    一步步教你在 Windows 上構(gòu)建 dotnet 系應(yīng)用的 UOS 軟件安裝包

    本文將詳細(xì)指導(dǎo)大家如何逐步為 dotnet 系列應(yīng)用創(chuàng)建滿足 UOS 統(tǒng)信系統(tǒng)軟件安裝包的要求。在這里,我們所說的 dotnet 系列應(yīng)用是指那些能夠在 Linux 平臺(tái)上構(gòu)建 UI 框架的應(yīng)用,包括但不限于 CPF 應(yīng)用、UNO 應(yīng)用、Avalonia 應(yīng)用等 基于 dotnet 系的自發(fā)布自包含的能力,可以將 dotnet

    2024年04月26日
    瀏覽(16)
  • 使用Qt Designer為您的Qt for Python項(xiàng)目創(chuàng)建基于Qt Widgets的圖形界面的兩種方法

    使用Qt Designer為您的Qt for Python項(xiàng)目創(chuàng)建基于Qt Widgets的圖形界面的兩種方法

    本頁(yè)介紹如何使用Qt Designer為您的Qt for Python項(xiàng)目創(chuàng)建基于Qt Widgets的圖形界面。Qt Designer是一個(gè)圖形UI設(shè)計(jì)工具,可以作為獨(dú)立的二進(jìn)制文件(pyside6-designer)提供,也可以嵌入到Qt Creator IDE中。它在Qt Creator中的使用在Using Qt Designer中描述。 設(shè)計(jì)存儲(chǔ)在.ui文件中,這是一種基于

    2024年02月07日
    瀏覽(27)
  • 迅為RK3568開發(fā)板Buildroot 系統(tǒng)自啟動(dòng) QT 程序

    迅為RK3568開發(fā)板Buildroot 系統(tǒng)自啟動(dòng) QT 程序

    本小節(jié)將講解如何開機(jī)自啟動(dòng) QT 程序。 在設(shè)置自啟動(dòng) QT 程序之前,首先要編譯好 QT 可執(zhí)行程序,完成以下兩步。 1、 已經(jīng)根據(jù) 03_【北京迅為】itop-3568 開發(fā)板快速使用編譯環(huán)境 ubuntu18.04 v1.0.doc 第 10 章節(jié)進(jìn)行了 QT 程序的交叉編譯 2、 將交叉編譯出的 QT 可執(zhí)行程序拷貝到/u

    2024年02月12日
    瀏覽(87)
  • Windows下的QT系統(tǒng)開發(fā)環(huán)境搭建

    Windows下的QT系統(tǒng)開發(fā)環(huán)境搭建

    ????????QT是一款由Qt?Company開發(fā)的跨平臺(tái)C++圖形用戶界面 應(yīng)用程序 開發(fā)框架。它既可以開發(fā) GUI 程序,也可用于開發(fā)非GUI程序,比如 控制臺(tái) 工具和服務(wù)器。Qt是面向?qū)ο蟮目蚣?,使用特殊?代碼 生成擴(kuò)展(稱為元對(duì)象編譯器(Meta?Object?Compiler,?moc))以及一些宏,Qt很容

    2024年02月09日
    瀏覽(23)
  • QGIS開發(fā)五:VS使用QT插件創(chuàng)建UI界面

    QGIS開發(fā)五:VS使用QT插件創(chuàng)建UI界面

    前面我們說了在創(chuàng)建項(xiàng)目時(shí)創(chuàng)建的是一個(gè)空項(xiàng)目,即不使用 Qt 提供的綜合開發(fā)套件 Qt Creator,也不使用 Qt Visual Studio Tools 這類工具。 但是后面發(fā)現(xiàn),如果我想要有更加滿意的界面布局,還是要自己寫一個(gè)UI文件,如果不使用QT插件,在VS中導(dǎo)入自己的UI文件編譯起來不是那么容

    2024年02月13日
    瀏覽(31)
  • Qt Creator啟動(dòng)后卡死無響應(yīng)的解決方法(已解決)

    我的是 有道云詞典屏幕取詞會(huì)與QtUI進(jìn)程產(chǎn)生沖突 ,我關(guān)掉了有道云詞典的取詞功能,則正常了。 參考這位博客,他還講了其它的一些可能原因:QTCreator打開無響應(yīng)問題_qt creator卡死_我對(duì)世界嗤之以鼻的博客-CSDN博客 如果?Qt Creator啟動(dòng)速度特別慢,可以看我這個(gè)博客:Qt Cr

    2024年02月14日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包