首頁 > 軟體

詳解Qt中執行緒的使用方法

2022-12-17 14:00:03

QT中使用執行緒可以提高工作效率。

要使用執行緒要經過一下四個步驟:

(1)先建立一個c++ class檔案,記得繼承Thread,建立步驟如下:

a、第一步

b、第二步

(2)自定義一個run函數,以後啟動執行緒的時候,程式就會跳轉到run函數中

void run();

(3)初始化執行緒

HDThread mythread = new HDThread();

(4)啟動執行緒

mythread->start();

下面來看看執行緒使用的具體列子:

執行緒標頭檔案hdthread.h:

#ifndef HDTHREAD_H
#define HDTHREAD_H
#include <QThread>
#include <QLabel>
#include <QMutex>

class HDTHread : public QThread
{
public:
    HDTHread(QMutex* mtex,QObject *parent = 0);
    void run();//自定義的run函數
    void setLabel(QLabel *lb);
private:
    QLabel *label;
    QMutex *mutex; //互斥鎖
};

#endif // HDTHREAD_H

主函數的標頭檔案threadqt.h

#ifndef THREADQT_H
#define THREADQT_H

#include <QMainWindow>
#include <hdthread.h>
#include <writefile.h>
#include <QMutex>
#include <QSemaphore>

namespace Ui {
class ThreadQt;
}

class ThreadQt : public QMainWindow
{
    Q_OBJECT

public:
    explicit ThreadQt(QWidget *parent = 0);
    ~ThreadQt();

     //定義靜態的訊號類
    static QSemaphore *sp_A;
    static QSemaphore *sp_B;
private slots:
    void on_pushButton_clicked();

private:
    Ui::ThreadQt *ui;

    HDTHread *thread; //hdtread類,裡面繼承了執行緒
    WriteFile *writethread;
    QMutex mutex;//定義互斥鎖類

};

#endif // THREADQT_H

原始檔hdthread.cpp:

#include "hdthread.h"
#include <QDebug>
#include <threadqt.h>
HDTHread::HDTHread(QMutex *mtex, QObject *parent):QThread(parent)//建構函式,用來初始化
{
    this->mutex = mtex;
}
void HDTHread::setLabel(QLabel *lb)
{
    this->label = lb;
}
 
void HDTHread::run() //啟動執行緒時執行的函數
{
    while(true)
    {
 
        qint64 data = qrand()%1000; //取亂數
        //this->mutex->lock();//上鎖
        ThreadQt::sp_A->acquire();//請求訊號
        this->label->setText(QString::number(data));
         sleep(1);
        ThreadQt::sp_B->release();//釋放訊號
        //this->mutex->unlock();//解鎖
 
        qDebug()<<"hello Qt"<<data;
    }
}

原始檔threadqt.cpp

#include "threadqt.h"
#include "ui_threadqt.h"
 
//初始化靜態變數
 QSemaphore *ThreadQt::sp_A = NULL;
 QSemaphore *ThreadQt::sp_B = NULL;
 
ThreadQt::ThreadQt(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::ThreadQt)
{
    ui->setupUi(this);
    //建立訊號物件
    sp_A = new QSemaphore(1);
    sp_B = new QSemaphore(0);
 
}
 
ThreadQt::~ThreadQt()
{
    delete ui;
}
 
void ThreadQt::on_pushButton_clicked()
{
    thread = new HDTHread(&mutex); //初始化執行緒
    thread->setLabel(ui->label);
    thread->start();//開啟執行緒
 
    writethread = new WriteFile(&mutex);
    writethread->setLabel(ui->label);
    writethread->start();
}

大家也看到了,此處的執行緒也用到了互斥鎖(號誌)保證執行緒讀寫資料時不出現錯誤,這裡大家可以看一下具體實現的程式碼

this->mutex->lock();//上鎖
ThreadQt::sp_A->acquire();//請求訊號
this->label->setText(QString::number(data));
sleep(1);
ThreadQt::sp_B->release();//釋放訊號
this->mutex->unlock();//解鎖

到此這篇關於詳解Qt中執行緒的使用方法的文章就介紹到這了,更多相關Qt執行緒內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com