Qt多線程即寫即用QThread實現方法

轉載:作者:Qt工坊
鏈接:https://www.jianshu.com/p/a2d4bbea3822

本文所介紹的這種Qt的線程用法在Qt的官方文檔中有類似介紹,這裏給出一個完整的示例共讀者參考。本文介紹的這種方法,並不是常見的通過繼承QThread,重寫run()函數來實現Qt多線程,而是通過moveToThread(QThread * thread)函數將工作類對象移到所創建的QThread對象中去執行。本方法巧妙的利用了Qt信號和槽機制。

基本思想

  1. 在主線程中,哪裏需用多線程,就在哪裏創建一個QThread實例;
  2. 把耗時操作封裝到一個繼承於QObject的子類(這裏叫做工作類Worker)槽函數中;
  3. 創建QThread實例和Worker實例,建立他們之間的信號和槽關係;
  4. 調用Worker實例的moveToThread(QThread * thread)函數,將它移動到創建的QThread線程中去;
  5. 最後,執行QThread線程的start()方法。

工作類

worker.h

#ifndef WORKER_H
#define WORKER_H
#include <QObject>
class Worker : public QObject
{
    Q_OBJECT
public:
    explicit Worker(QObject *parent = 0);
signals:
    void complete();
public slots:
    void doLongTimeWork();//耗時操作
};
#endif // WORKER_H

worker.cpp

#include "worker.h"
#include <QDebug>
#include <QThread>
Worker::Worker(QObject *parent) : QObject(parent)
{

}
void Worker::doLongTimeWork()
{
    qDebug()<<__LINE__<<__FUNCTION__<<" - enter";
    qint64 count = 100;
    while(count--){
        QThread::msleep(10);
        qDebug()<<__LINE__<<__FUNCTION__<<"count = "<<count;
    }
    emit complete();
    qDebug()<<__LINE__<<__FUNCTION__<<" - leave";
}

使用方法

void MainWindow::on_pushButtonDoWork_clicked()
{
    Worker* worker = new Worker();
    QThread* thread = new QThread();
    //當線程啓動時,執行Worker類的耗時函數doLongTimeWork()
    connect(thread,SIGNAL(started()),worker,SLOT(doLongTimeWork()));
    //當耗時函數執行完畢,發出complete()信號時,刪除worker實例
    connect(worker,SIGNAL(complete()),worker,SLOT(deleteLater()));
    //當worker對象實例銷燬時,退出線程
    connect(worker,SIGNAL(destroyed(QObject*)),thread,SLOT(quit()));
    //當線程結束時,銷燬線程對象實例
    connect(thread,SIGNAL(finished()),thread,SLOT(deleteLater()));
    //移動worker對象實例到線程中
    worker->moveToThread(thread);
    //啓動線程
    thread->start();
}

運行效果

運行效果.png

源代碼下載

百度網盤分享地址:
鏈接:https://pan.baidu.com/s/1vKXwHnagnS-RLgafYaec4Q
提取碼:gsii

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章