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

QT線程QThread的使用介紹

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

1. 概述

QThread 有兩種使用方式

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

2. moveThread 示例

步驟概述:

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

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();                //啟動(dòng)線程
        qDebug()<<"current thread ID:"<<QThread::currentThreadId()<<'\n';
        emit touchWork("working");
    }
    ~ThreadController()
    {
        workerThread.quit();
        workerThread.wait();
    }
signals:
    // 發(fā)出信號(hào)觸發(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的特性機(jī)制如信號(hào)槽,因?yàn)?code>moc不會(huì)在cpp文件中處理這些機(jī)制??梢愿模容^麻煩,建議將類定義在頭文件中即可。

3. QThread 示例

方法概述:

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

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();
}

輸出結(jié)果:

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

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

4. 總結(jié)

  1. moveToThread

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

  1. QThread

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

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

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

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

相關(guān)文章

  • C語(yǔ)言動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn)示例

    C語(yǔ)言動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn)示例

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

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

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

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

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

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

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

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

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

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

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

    數(shù)據(jù)結(jié)構(gòu)之堆詳解

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

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

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

    C++簡(jiǎn)單又好用的基本運(yùn)算符重載

    繼友元知識(shí)過(guò)后,就到了今天的C++運(yùn)算符重載的內(nèi)容了,運(yùn)算符重載是C++里比較重要的內(nèi)容。這篇博文不會(huì)一下子講完各種運(yùn)算符重載,因?yàn)樘嗔肆艘膊缓梦照莆眨赃\(yùn)算符重載我準(zhǔn)備分多次記錄和分享,那么接下來(lái)進(jìn)入正文
    2022-06-06
  • C語(yǔ)言刷題判斷鏈表中是否有環(huán)題解

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

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

最新評(píng)論

昆山市| 波密县| 兰溪市| 三明市| 惠来县| 咸阳市| 那曲县| 林西县| 长岛县| 濉溪县| 许昌市| 泾阳县| 页游| 常熟市| 林西县| 巩留县| 定陶县| 资阳市| 威信县| 买车| 佛教| 武清区| 遵义市| 呈贡县| 福清市| 三门县| 辽源市| 翼城县| 祁阳县| 许昌县| 榆林市| 伽师县| 三河市| 买车| 濮阳市| 舞钢市| 光山县| 洞头县| 苍溪县| 高安市| 财经|