欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Qt5多线程编程的实现

程序员文章站 2022-06-22 17:02:30
目录一、线程基础1、gui线程与工作线程2、数据的同步访问二、qt多线程简介三、qthread线程四、简单实例一、线程基础1、gui线程与工作线程每个程序启动后拥有的第一个线程称为主线程,即gui线程...

一、线程基础

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、建立工程

Qt5多线程编程的实现

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

Qt5多线程编程的实现

3、添加工作线程

建立头文件workthread.h

Qt5多线程编程的实现

Qt5多线程编程的实现

在右侧添加如下代码

Qt5多线程编程的实现

#include <qthread>
 
class workthread : public qthread
{
    q_object
 
public:
    workthread();
 
protected:
    void run();
};

4、添加workthread.cpp文件

Qt5多线程编程的实现

在右侧添加如下代码:

Qt5多线程编程的实现

重写run()函数

Qt5多线程编程的实现

重写run()函数

Qt5多线程编程的实现

#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中添加如下内容:

Qt5多线程编程的实现

#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多线程编程的实现的文章就介绍到这了,更多相关qt5多线程 内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

相关标签: Qt5 多线程