日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

QT線程QThread的使用介紹_C 語言

作者:憤怒的小黃鴨 ? 更新時(shí)間: 2022-10-27 編程語言

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ù)中寫入具體的線程代碼
  • 通過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的方式,不過也看各自的使用場景!!!比如高頻執(zhí)行某個(gè)任務(wù)最好還是使用重寫QThread::run()的方式。

原文鏈接:https://blog.csdn.net/weixin_41111116/article/details/126372972

欄目分類
最近更新