详解Qt中线程的使用方法

 更新时间:2022年12月16日 08:16:57   作者:音视频开发老舅  
这篇文章主要为大家详细介绍了Qt中线程的使用方法,文中的示例代码讲解详细,对我们学习Qt有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下

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线程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++11中列表初始化机制的概念与实例详解

    C++11中列表初始化机制的概念与实例详解

    在我们实际编程中,我们经常会碰到变量初始化的问题,对于不同的变量初始化的手段多种多样,下面这篇文章主要给大家介绍了关于C++11中列表初始化机制的相关资料,需要的朋友可以参考下
    2021-11-11
  • C++编程中new运算符的使用学习教程

    C++编程中new运算符的使用学习教程

    这篇文章主要介绍了C++编程中new运算符的使用学习教程,是C++入门学习中的基础知识,需要的朋友可以参考下
    2016-01-01
  • 解析wprintf 中使用%I64d格式化输出LONGLONG的详细介绍

    解析wprintf 中使用%I64d格式化输出LONGLONG的详细介绍

    本篇文章是对wprintf 中使用%I64d格式化输出LONGLONG进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++常见错误中英文对照表

    C++常见错误中英文对照表

    对于刚学编程,刚接触C++的新手来说,编译运行报错是最头疼的一件事,爆出一堆英文,英语差一点的又不知道什么意思,所以也不知道如何去改,在此,我给大家传一份常见错误中英文对照表及简单解释,希望可以帮到大家
    2016-05-05
  • C++常量详解一(常量指针与常量引用的初始化)

    C++常量详解一(常量指针与常量引用的初始化)

    这篇文章主要介绍了C++常量详解一(常量指针与常量引用的初始化),需要的朋友可以参考下
    2017-06-06
  • Qt调用MATLAB引擎混合编程的过程详解

    Qt调用MATLAB引擎混合编程的过程详解

    这篇文章给大家介绍了Qt调用MATLAB引擎混合编程的全过程,文中通过图文结合的方式给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • C语言实现电话簿管理系统

    C语言实现电话簿管理系统

    这篇文章主要为大家详细介绍了C语言实现电话簿管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • c++ 基于opencv 识别、定位二维码

    c++ 基于opencv 识别、定位二维码

    这篇文章主要介绍了c++ 基于opencv 识别、定位二维码,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下
    2021-03-03
  • C++面试八股文之左值与右值

    C++面试八股文之左值与右值

    简单来说,左值就是可以使用&符号取地址的值,而右值一般不可以使用&符号取地址,这篇文章主要来和大家讲讲面试中左值与右值常考的知识点,需要的可以参考一下
    2023-06-06
  • C++抽象数据类型介绍

    C++抽象数据类型介绍

    这篇文章主要介绍了C++抽象数据类型,我们在学数据结构的时候,经常遇到的一个概念就是抽象数据类型(Abstract Data Type),简称ADT。下面我们就对ADT作更多介绍,需要的朋友可以参考一下
    2022-01-01

最新评论