最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

QT線程QThread的使用介紹

 更新時間:2022年09月01日 10:06:31   作者:憤怒的小黃鴨  
在進行桌面應用程序開發(fā)的時候,假設程序在某些情況要處理復雜邏輯, 如果一個線程去處理,就會導致窗口卡頓,無法處理用戶操作。這就需要使用多線程,其中一個線程處理窗口事件,其他線程進行邏輯運算,多個線程各司其職,不僅可以提高用戶體驗還可以提升程序的執(zhí)行效率

1. 概述

QThread 有兩種使用方式

  1. QObject::moveToThread()
  2. 派生QThread的子類類

2. moveThread 示例

步驟概述:

  • 定義一個QObject派生類,在派生類中定義一個槽函數(shù),此函數(shù)是用于執(zhí)行具體的工作
  • 在要使用線程的類中,新建QThreadQObject派生類對象,并使用moveThread()將派生類的處理交由QThread
  • 將觸發(fā)線程工作的信號與派生類的槽函數(shù)進行連接

ThreadWorker.hpp代碼如下:

#ifndef THREADWORKER_HPP
#define THREADWORKER_HPP
#include <QObject>
#include <QString>
#include <QThread>
#include <QDebug>
class ThreadWorker:public QObject
{
    Q_OBJECT
public:
    ThreadWorker() {}
public slots:
    void work(QString p1)
    {
        qDebug() << "current thread ID:" << QThread::currentThreadId();
        qDebug() << p1;
        QThread::sleep(10);
        qDebug() << "thread run finish!";
    }
};
#endif // THREADWORKER_HPP

ThreadController.hpp代碼如下:

#ifndef THREADCONTROLLER_H
#define THREADCONTROLLER_H
#include "ThreadWorker.hpp"
class ThreadController:public QObject
{
    Q_OBJECT
    QThread workerThread;
public:
    ThreadController():QObject()
    {
        ThreadWorker* threadWork = new ThreadWorker();
        // 將 threadWork 移交給 workerThread
        threadWork->moveToThread(&workerThread);
        QObject::connect(this,SIGNAL(touchWork(QString)),threadWork,SLOT(work(QString)));
        QObject::connect(&workerThread,&QThread::finished,threadWork,&QObject::deleteLater);
        workerThread.start();                //啟動線程
        qDebug()<<"current thread ID:"<<QThread::currentThreadId()<<'\n';
        emit touchWork("working");
    }
    ~ThreadController()
    {
        workerThread.quit();
        workerThread.wait();
    }
signals:
    // 發(fā)出信號觸發(fā)線程
    void touchWork(QString p1);
};
#endif // THREADCONTROLLER_H

main.cpp代碼如下:

#include <QCoreApplication>
#include "ThreadController.hpp"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    ThreadController tc = ThreadController();
    return a.exec();
}

注意:

不能再cpp文件中使用QT的特性機制如信號槽,因為moc不會在cpp文件中處理這些機制??梢愿模容^麻煩,建議將類定義在頭文件中即可。

3. QThread 示例

方法概述:

  • 定義一個QThread的派生類,并重載run()函數(shù),在run()函數(shù)中寫入具體的線程代碼
  • 通過start()啟動線程

CustomThread.hpp代碼如下

#ifndef CUSTOMTHREAD_H
#define CUSTOMTHREAD_H
#include <QThread>
#include <QDebug>
class CustomThread:public QThread
{
    Q_OBJECT
public:
    CustomThread() {}
signals:
    void customThreadSignal();
public slots:
    void customThreadSlot()
    {
        qDebug()<<"current thread ID(in slot function):"<<QThread::currentThreadId()<<'\n';
    }
protected:
    void run() override
    {
        qDebug()<<"current thread ID:"<<QThread::currentThreadId()<<'\n';
        QThread::sleep(10);
        qDebug() << "thread run finish!";
        emit customThreadSignal();
    }
};
#endif // CUSTOMTHREAD_H

main.cpp代碼如下

#include <QCoreApplication>
#include "CustomThread.hpp"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << "main thread ID:" << QThread::currentThreadId();
    CustomThread customThread;
    QObject::connect(&customThread,&CustomThread::customThreadSignal,&customThread,&CustomThread::customThreadSlot);
    customThread.start();
    return a.exec();
}

輸出結果:

main thread ID: 0x6508
current thread ID: 0x6544 

thread run finish!
current thread ID(in slot function): 0x6508 

4. 總結

  1. moveToThread

此方式,要求把需要進行的工作全部封裝在一個類中,將每一個任務定義為一個槽函數(shù),并與之對應的信號進行關聯(lián),最后調(diào)用moveToThread將此類交QThread對象。QThread調(diào)用start()進行啟動,之后每個任務由相應的信號進行觸發(fā)然后執(zhí)行。

  1. QThread

此方式是要求基于QThread進行派生,對派生類進行run()函數(shù)的override。之后調(diào)用start()后,就會運行run()函數(shù)。但是在派生類中定義的槽函數(shù),不會由派生類自身所執(zhí)行,而是由該線程的擁有者執(zhí)行。

QThread只有run函數(shù)是在新線程里執(zhí)行,其他所有函數(shù)都在QThread生成的線程里執(zhí)行

官方是比較推薦使用moveToThread的方式,不過也看各自的使用場景?。?!比如高頻執(zhí)行某個任務最好還是使用重寫QThread::run()的方式。

到此這篇關于QT線程QThread的使用介紹的文章就介紹到這了,更多相關QT線程QThread內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言動態(tài)內(nèi)存管理的實現(xiàn)示例

    C語言動態(tài)內(nèi)存管理的實現(xiàn)示例

    動態(tài)內(nèi)存管理是一種允許程序在運行時根據(jù)需要動態(tài)申請和回收內(nèi)存的策略,它提供了四種重要的函數(shù),本文就來介紹一下,感興趣的可以了解一下
    2024-11-11
  • C語言遞歸實現(xiàn)字符串逆序的方式詳解

    C語言遞歸實現(xiàn)字符串逆序的方式詳解

    這篇文章主要介紹了C語言遞歸實現(xiàn)字符串逆序的方式詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • c++11 新特性——智能指針使用詳解

    c++11 新特性——智能指針使用詳解

    這篇文章主要介紹了c++11 新特性——智能指針使用的相關資料,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2021-02-02
  • C++實現(xiàn)LeetCode數(shù)組練習題

    C++實現(xiàn)LeetCode數(shù)組練習題

    這篇文章主要介紹了C++實現(xiàn)LeetCode的幾道數(shù)組練習題,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語言鏈表實現(xiàn)歌手評分系統(tǒng)

    C語言鏈表實現(xiàn)歌手評分系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言鏈表實現(xiàn)歌手評分系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • QT連接Mysql數(shù)據(jù)庫的實現(xiàn)步驟

    QT連接Mysql數(shù)據(jù)庫的實現(xiàn)步驟

    本文主要介紹了QT連接Mysql數(shù)據(jù)庫的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • 數(shù)據(jù)結構之堆詳解

    數(shù)據(jù)結構之堆詳解

    這篇文章主要介紹了數(shù)據(jù)結構之堆詳解,本文講解了堆的基本常識堆的基本操作、堆的應用等內(nèi)容,需要的朋友可以參考下
    2014-08-08
  • Linux中使用VS Code編譯調(diào)試C++項目詳解

    Linux中使用VS Code編譯調(diào)試C++項目詳解

    最近因為項目的需求,需要在Linux下開發(fā)C++相關項目,經(jīng)過一番摸索最終實現(xiàn)了,下面這篇文章就給大家簡單總結了一下如何通過VS Code進行編譯調(diào)試的一些注意事項。有需要的朋友們可以參考借鑒,下面來跟著小編一起看看吧。
    2016-12-12
  • C++簡單又好用的基本運算符重載

    C++簡單又好用的基本運算符重載

    繼友元知識過后,就到了今天的C++運算符重載的內(nèi)容了,運算符重載是C++里比較重要的內(nèi)容。這篇博文不會一下子講完各種運算符重載,因為太多了了也不好吸收掌握,所以運算符重載我準備分多次記錄和分享,那么接下來進入正文
    2022-06-06
  • C語言刷題判斷鏈表中是否有環(huán)題解

    C語言刷題判斷鏈表中是否有環(huán)題解

    這篇文章主要為大家介紹了C語言刷題判斷鏈表中是否有環(huán)題解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07

最新評論

安福县| 莎车县| 湖南省| 师宗县| 太仆寺旗| 金川县| 康平县| 台南市| 中西区| 铜山县| 平乐县| 英德市| 望奎县| 泾阳县| 余庆县| 吉隆县| 东安县| 苍溪县| 宁海县| 贞丰县| 亳州市| 寿宁县| 永顺县| 壤塘县| 老河口市| 县级市| 营山县| 镇沅| 维西| 安阳县| 兰溪市| 东乌珠穆沁旗| 稷山县| 临洮县| 蒙山县| 化德县| 高台县| 颍上县| 甘泉县| 德兴市| 南充市|