Qt5多线程编程的实现
目录
- 一、线程基础
- 1、GUI线程与工作线程
- 2、数据的同步访问
- 二、QT多线程简介
- 三、QThread线程
- 四、简单实例
一、线程基础
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
文章图片
文章图片
在右侧添加如下代码
文章图片
#includeclass WorkThread : public QThread{Q_OBJECT public:WorkThread(); protected:void run(); };
4、添加workthread.cpp文件
文章图片
在右侧添加如下代码:
文章图片
重写run()函数
文章图片
重写run()函数
文章图片
#include "workthread.h"#includeWorkThread::WorkThread(){ } void WorkThread::run(){while (true){for ( int n = 0; n < 10; n++ ){qDebug()<
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多线程编程的实现的文章就介绍到这了,更多相关Qt5多线程 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 直播回顾(准确性提升到 5 秒级,ssar 独创的 load5s 指标有多硬核(| 龙蜥技术))
- linux编译安卓需要多大内存,8G运存已经过时了(手机运存到底要多大才够用?...)
- MySQL数据优化-多层索引
- 面试集锦专栏|【面试常问】线程中常用的方法
- 为什么需要线程池(什么是池化技术?)
- JAVA高并发程序设计|多线程关于无锁的线程是否安全问题
- JAVA高并发程序设计|六道热门多线程面试题,你学废了吗?
- JAVA高并发程序设计|带你深度刨析多线程的同步控制
- 剑指offer编程题解法汇总|力扣解法汇总1601- 最多可达成的换楼请求数目
- 记一次Spring|记一次Spring|项目启动耗时超级长的优化【从7分钟优化到1分多钟】