Qt5多线程编程的实现

 更新时间:2021年12月14日 15:39:46   作者:fjqlldg  
Qt通过三种形式提供了对线程的支持,本文主要介绍了Qt5多线程编程的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一、线程基础

1、GUI线程与工作线程

每个程序启动后拥有的第一个线程称为主线程,即GUI线程。QT中所有的组件类和几个相关的类只能工作在GUI线程,不能工作在次线程,次线程即工作线程,主要负责处理GUI线程卸下的工作。

2、数据的同步访问

每个线程都有自己的栈,因此每个线程都要自己的调用历史和本地变量。线程共享相同的地址空间。

二、QT多线程简介

    Qt通过三种形式提供了对线程的支持,分别是平台无关的线程类、线程安全的事件投递、跨线程的信号-槽连接。

    Qt中线程类包含如下:

  • QThread 提供了跨平台的多线程解决方案
  • QThreadStorage 提供逐线程数据存储
  • QMutex 提供相互排斥的锁,或互斥量
  • QMutexLocker 是一个辅助类,自动对 QMutex 加锁与解锁
  • QReadWriterLock 提供了一个可以同时读操作的锁
  • QReadLocker与QWriteLocker 自动对QReadWriteLock 加锁与解锁
  • QSemaphore 提供了一个整型信号量,是互斥量的泛化
  • QWaitCondition 提供了一种方法,使得线程可以在被另外线程唤醒之前一直休眠。

三、QThread线程

1、QThread线程基础

    QThread是Qt线程中有一个公共的抽象类,所有的线程类都是从QThread抽象类中派生的,需要实现QThread中的虚函数run(),通过start()函数来调用run函数。

    void run()函数是线程体函数,用于定义线程的功能。

    void start()函数是启动函数,用于将线程入口地址设置为run函数。

    void terminate()函数用于强制结束线程,不保证数据完整性和资源释放。

    QCoreApplication::exec()总是在主线程(执行main()的线程)中被调用,不能从一个QThread中调用。在GUI程序中,主线程也称为GUI线程,是唯一允许执行GUI相关操作的线程。另外,必须在创建一个QThread前创建QApplication(or QCoreApplication)对象。

    当线程启动和结束时,QThread会发送信号started()和finished(),可以使用isFinished()和isRunning()来查询线程的状态。

    从Qt4.8起,可以释放运行刚刚结束的线程对象,通过连接finished()信号到QObject::deleteLater()槽。 
    使用wait()来阻塞调用的线程,直到其它线程执行完毕(或者直到指定的时间过去)。

    静态函数currentThreadId()和currentThread()返回标识当前正在执行的线程。前者返回线程的ID,后者返回一个线程指针。

要设置线程的名称,可以在启动线程之前调用setObjectName()。如果不调用setObjectName(),线程的名称将是线程对象的运行时类型(QThread子类的类名)。

四、简单实例

1、建立工程

2、设计ui及控件、控件属性

3、添加工作线程

建立头文件workthread.h

在右侧添加如下代码

#include <QThread>
 
class WorkThread : public QThread
{
    Q_OBJECT
 
public:
    WorkThread();
 
protected:
    void run();
};

4、添加workthread.cpp文件

在右侧添加如下代码:

重写run()函数

重写run()函数

#include "workthread.h"
#include <QtDebug>
 
WorkThread::WorkThread()
{
 
}
 
void WorkThread::run()
{
    while (true)
    {
        for ( int n = 0; n < 10; n++ )
        {
            qDebug()<<n<<n<<n<<n<<n<<n<<n<<n;
        }
    }
}

5、在threaddlg.h中添加如下内容:

#include "workthread.h"
#define MAXSIZE 1
 
 
 
public slots:
    void slotStart();
    void slotStop();
    void slotExit();
 
private:
 
    WorkThread *workThread[MAXSIZE];

 6、在threaddlg.cpp中完成槽函数功能

    connect(ui->startBtn,   SIGNAL(clicked(bool)),this, SLOT(slotStart()));
    connect(ui->stopBtn,    SIGNAL(clicked(bool)),this, SLOT(slotStop()));
    connect(ui->exitBtn,    SIGNAL(clicked(bool)),this, SLOT(slotExit()));
 
void threadDlg::slotStart()
{
    for ( int i = 0; i < MAXSIZE; i++ )
    {
        workThread[i] = new WorkThread();
    }
 
    for ( int i = 0; i < MAXSIZE; i++ )
    {
        workThread[i]->start();
    }
 
    ui->startBtn->setEnabled(false);
    ui->stopBtn->setEnabled(true);
}
void threadDlg::slotStop()
{
    for ( int i = 0; i < MAXSIZE; i++ )
    {
        workThread[i]->terminate();
        workThread[i]->wait();
    }
 
    ui->startBtn->setEnabled(true);
    ui->stopBtn->setEnabled(false);
}
void threadDlg::slotExit()
{
    this->close();
}

运行效果

到此这篇关于Qt5多线程编程的实现的文章就介绍到这了,更多相关Qt5多线程 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++深浅拷贝及简易string类实现方式

    C++深浅拷贝及简易string类实现方式

    这篇文章主要介绍了C++深浅拷贝及简易string类实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 详解在C++中显式默认设置的函数和已删除的函数的方法

    详解在C++中显式默认设置的函数和已删除的函数的方法

    这篇文章主要介绍了在C++中显式默认设置的函数和已删除的函数的方法,文中讲到了C++11标准中的新特性,需要的朋友可以参考下
    2016-01-01
  • C++设计模式编程中Facade外观模式的使用实例解析

    C++设计模式编程中Facade外观模式的使用实例解析

    这篇文章主要介绍了C++设计模式编程中Facade外观模式的使用实例解析,外观模式的主要用途就是为子系统的复杂处理过程提供方便的调用方法,需要的朋友可以参考下
    2016-03-03
  • C++实现 vector 的四则运算

    C++实现 vector 的四则运算

    本文给大家介绍的是在C++中实现高效的vector四则运算的方法的相关资料,需要的朋友可以参考下
    2016-07-07
  • C语言 模拟实现strcpy与strcat函数详解

    C语言 模拟实现strcpy与strcat函数详解

    这篇文章主要介绍了怎样用C语言模拟实现strcpy与strcat函数,strcpy()函数是C语言中的一个复制字符串的库函数,strcat()函数的功能是实现字符串的拼接
    2022-04-04
  • Qt项目实战之实现多文本编辑器

    Qt项目实战之实现多文本编辑器

    这篇文章主要为大家详细介绍了如何利用Qt实现简易的多文本编辑器,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以了解一下
    2023-03-03
  • C++实现冒泡排序(BubbleSort)

    C++实现冒泡排序(BubbleSort)

    这篇文章主要为大家详细介绍了C++实现冒泡排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • OpenCV实现马赛克功能

    OpenCV实现马赛克功能

    这篇文章主要为大家详细介绍了OpenCV实现马赛克功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C语言示例讲解do while循环语句的用法

    C语言示例讲解do while循环语句的用法

    在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。一组被重复执行的语句称之为循环体,能否继续重复,决定循环的终止条件
    2022-06-06
  • C/C++中命名空间(namespace)详解及其作用介绍

    C/C++中命名空间(namespace)详解及其作用介绍

    今天小编就为大家分享一篇关于C++命名空间namespace的介绍与使用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-09-09

最新评论