欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

QT線程QThread的使用介紹

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

1. 概述

QThread 有兩種使用方式

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

2. moveThread 示例

步驟概述:

  • 定義一個QObject派生類,在派生類中定義一個槽函數(shù),此函數(shù)是用于執(zhí)行具體的工作
  • 在要使用線程的類中,新建QThreadQObject派生類對象,并使用moveThread()將派生類的處理交由QThread
  • 將觸發(fā)線程工作的信號與派生類的槽函數(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();                //啟動線程
        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的特性機(jī)制如信號槽,因為moc不會在cpp文件中處理這些機(jī)制??梢愿?,但比較麻煩,建議將類定義在頭文件中即可。

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

輸出結(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)行的工作全部封裝在一個類中,將每一個任務(wù)定義為一個槽函數(shù),并與之對應(yīng)的信號進(jìn)行關(guān)聯(lián),最后調(diào)用moveToThread將此類交QThread對象。QThread調(diào)用start()進(jìn)行啟動,之后每個任務(wù)由相應(yīng)的信號進(jìn)行觸發(fā)然后執(zhí)行。

  1. QThread

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

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

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

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

相關(guān)文章

  • 詳解OpenMP的線程同步機(jī)制

    詳解OpenMP的線程同步機(jī)制

    在本篇文章當(dāng)中主要給大家介紹?OpenMP?當(dāng)中線程的同步和互斥機(jī)制,在?OpenMP?當(dāng)中主要有三種不同的線程之間的互斥方式。下面就來和大家來討論一下OpenMP當(dāng)中的互斥操作,需要的可以參考一下
    2023-01-01
  • C語言中遞歸的實際應(yīng)用與經(jīng)典問題

    C語言中遞歸的實際應(yīng)用與經(jīng)典問題

    函數(shù)以及函數(shù)的遞歸調(diào)用是學(xué)習(xí)C語言必須要掌握的內(nèi)容,且遞歸作為經(jīng)典的算法思想被廣泛應(yīng)用于程序設(shè)計中,下面這篇文章主要給大家介紹了關(guān)于C語言中遞歸的實際應(yīng)用與經(jīng)典問題的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • c++插入排序詳解

    c++插入排序詳解

    插入排序的基本思想是每次將一個待排序的記錄,按其關(guān)鍵字大小插入到前面已經(jīng)排好序的子文件中的適當(dāng)位置,直到全部記錄插入完成為止。下面我們來詳細(xì)探討下C++實現(xiàn)插入排序
    2017-05-05
  • 簡單分析C++指針的操作和運(yùn)算

    簡單分析C++指針的操作和運(yùn)算

    這篇文章主要介紹了簡單分析C++指針的操作和運(yùn)算的相關(guān)資料,需要的朋友可以參考下
    2015-07-07
  • C語言-I/O流設(shè)計實驗

    C語言-I/O流設(shè)計實驗

    編程語言的I/O類庫中常常使用流這個抽象的概念,它代表任何有能力產(chǎn)生數(shù)據(jù)的數(shù)據(jù)源對象或時有能力接收數(shù)據(jù)的接收端對象,本文為大家介紹C語言中I/O系統(tǒng)基礎(chǔ)知識
    2021-07-07
  • 基于OpenCV和C++ 實現(xiàn)圖片旋轉(zhuǎn)

    基于OpenCV和C++ 實現(xiàn)圖片旋轉(zhuǎn)

    這篇文章主要介紹了基于OpenCV和C++ 實現(xiàn)圖片旋轉(zhuǎn),幫助大家更好的利用c++處理圖片,感興趣的朋友可以了解下
    2020-12-12
  • C++中的友元函數(shù)與友元類詳情

    C++中的友元函數(shù)與友元類詳情

    這篇文章主要介紹了C++中的友元函數(shù)與友元類詳情,對類的封裝是C++三大特性中的一個重要特性,封裝好的數(shù)據(jù)在類的外部是訪問不到的但是一旦出了問題,想要操作被封裝的數(shù)據(jù)怎么辦呢?由此友元函數(shù)友元類誕生了,下文我們來詳細(xì)來接一下具體的有緣類吧
    2022-02-02
  • QT修改項目名稱的圖文示例

    QT修改項目名稱的圖文示例

    本文主要介紹了QT修改項目名稱的圖文示例,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • C語言中宏定義的教學(xué)詳解

    C語言中宏定義的教學(xué)詳解

    在C語言中,宏定義是預(yù)處理器的指令,主要用于為各種數(shù)據(jù)創(chuàng)建別名,這篇文章主要來和大家分享一下宏定義的相關(guān)基礎(chǔ)知識,需要的小伙伴可以了解一下
    2023-07-07
  • C++ 實現(xiàn)稀疏矩陣的壓縮存儲的實例

    C++ 實現(xiàn)稀疏矩陣的壓縮存儲的實例

    這篇文章主要介紹了C++ 實現(xiàn)稀疏矩陣的壓縮存儲的實例的相關(guān)資料,M*N的矩陣,矩陣中有效值的個數(shù)遠(yuǎn)小于無效值的個數(shù),且這些數(shù)據(jù)的分布沒有規(guī)律,需要的朋友可以參考下
    2017-07-07

最新評論