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

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

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

詳解Qt中線程的使用方法_C 語言

作者:音視頻開發(fā)老舅 ? 更新時(shí)間: 2023-01-15 編程語言

QT中使用線程可以提高工作效率。

要使用線程要經(jīng)過一下四個(gè)步驟:

(1)先創(chuàng)建一個(gè)c++ class文件,記得繼承Thread,創(chuàng)建步驟如下:

a、第一步

b、第二步

(2)自定義一個(gè)run函數(shù),以后啟動線程的時(shí)候,程序就會跳轉(zhuǎn)到run函數(shù)中

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函數(shù)
    void setLabel(QLabel *lb);
private:
    QLabel *label;
    QMutex *mutex; //互斥鎖
};

#endif // HDTHREAD_H

主函數(shù)的頭文件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();

     //定義靜態(tài)的信號類
    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)//構(gòu)造函數(shù),用來初始化
{
    this->mutex = mtex;
}
void HDTHread::setLabel(QLabel *lb)
{
    this->label = lb;
}
 
void HDTHread::run() //啟動線程時(shí)執(zhí)行的函數(shù)
{
    while(true)
    {
 
        qint64 data = qrand()%1000; //取隨機(jī)數(shù)
        //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"
 
//初始化靜態(tài)變量
 QSemaphore *ThreadQt::sp_A = NULL;
 QSemaphore *ThreadQt::sp_B = NULL;
 
ThreadQt::ThreadQt(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::ThreadQt)
{
    ui->setupUi(this);
    //創(chuàng)建信號對象
    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();
}

大家也看到了,此處的線程也用到了互斥鎖(信號量)保證線程讀寫數(shù)據(jù)時(shí)不出現(xiàn)錯(cuò)誤,這里大家可以看一下具體實(shí)現(xiàn)的代碼

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

原文鏈接:https://blog.csdn.net/m0_60259116/article/details/128334992

欄目分類
最近更新