目录

1、线程基础

1.1、GUI线程与工作线程

1.2、数据的同步访问

2、QT多线程简介

3、QThread线程类

4、创建并启动线程


QThread类提供不依赖于平台的管理线程的方法。一个QThread类的对象管理一个线程,一 般从QThread继承一个自定义类,并重定义虚函数run(),在run()函数里实现线程需要完成的任务。

1、线程基础

1.1、GUI线程与工作线程

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

所以,一些GUI显示的工作只能放在主线程,不能放在工作线程中。

1.2、数据的同步访问

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

2、QT多线程简介

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

QT中线程类包含如下:

1)QThread 提供了跨平台的多线程解决方案;

2)QThreadStorage 提供逐线程数据存储

3)QMutex 提供相互排斥的锁,或互斥量;QMutexLocker 是一个辅助类,自动对 QMutex 加锁与解锁;

4)QReadWriterLock 提供了一个可以同时读操作的锁;QReadLocker与QWriteLocker 自动对QReadWriteLock 加锁与解锁;

5)QSemaphore 提供了一个整型信号量,是互斥量的泛化;

6)QWaitCondition 提供了一种方法,使得线程可以在被另外线程唤醒之前一直休眠。

3、QThread线程类

将应用程序的线程称为主线程,额外创建的线程称为工作线程。一般在主线程里创建工作线程,并调用start()开始执行工作线程的任务。

QThread类的主要接口函数、信号和槽函数见下表:

关键函数说明:

1)启动关闭函数

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

start()会在内部调用run()函数,进入工作线程的事件循环,在run()函数里调用exit()或quit()可以结束线程的事件循环,或在主线程里调用terminate() 强制结束线程。

void run() 函数是线程体函数,用于定义线程的功能。
void start() 函数是启动函数,用于将线程入口地址设置为run函数。
void terminate() 函数用于强制结束线程,不保证数据完整性和资源释放。
void wait() 阻塞调用的线程,直到其它线程执行完毕(或者直到指定的时间过去)。int exec() 进入事件循环并等待直到调用exit(),返回值是通过调用exit()来获得,如果调用成功则返回0。
void quit() 通知线程事件循环退出,返回0表示成功,相当于调用了QThread::exit(0)。

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

void terminate(); 结束线程,线程是否立即终止取决于操作系统。

线程被终止时,所有等待该线程Finished的线程都将被唤醒。terminate是否调用取决于setTerminationEnabled ( bool enabled = true )开关。

2)信号量

当线程启动和结束时,QThread会发送信号started()和finished(),可以使用isFinished()和isRunning()来查询线程的状态。从Qt4.8起,可以释放运行刚刚结束的线程对象,通过连接finished()信号到QObject::deleteLater()槽。

void started() 线程开始执行之前发射,也就是run()函数被调用之前
void finished() 线程就要结束时发射

3)其它

静态函数:

currentThreadId() // 返回标识当前正在执行的线程的ID
currentThread() // 返回标识当前正在执行的线程的指针

设置线程名称,如果不调用setObjectName(),线程的名称将是线程对象的运行时类型(QThread子类的类名):

setObjectName() // 在启动线程之前调用,用于设置线程的名称

4、创建并启动线程

执行步骤:

1)自定义类继承自QThread;

2)实现run()函数;

3)主函数中定义类对象并调用start()。

#include <QCoreApplication>
#include <QThread>
#include <QDebug>class ThreadTest: public QThread
{
public:ThreadTest() {}void run(){qDebug()<<objectName()<<" : run";sleep(2);qDebug()<<objectName()<<" : exit";}
};int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);ThreadTest threada;threada.setObjectName(ThreadTest);threada.start();qDebug()<<"threada end";return a.exec();
}

结果:

传送门:qt多线程系列文章目录

1、QT多线程编程详解(线程优先级):

QT多线程编程详解_coolboywjun的专栏-CSDN博客_qt多线程

使用qt实现多线程编程相关推荐

  1. 使用Qt的多线程编程

    Qt的多线程编程 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 我们展示了如何将自定义类型与元对象系统集成在一起,使它们能够存储在QVariant对象中,在调试信息 ...

  2. Qt实现多线程编程的两种方式

    Qt实现多线程编程的两种方式 方式一: 继承自QThread类,覆写run函数.此实现方法只有run函数内的代码是运行在子线程内. 代码示例: #ifndef QDEMOTHREAD_H #defin ...

  3. Qt之多线程编程初识

    做项目时遭遇用户界面冻结的问题,究其原因是槽函数里装了一个需要CPU密集操作的功能.使用多线程,可以解决界面冻结的问题. 多线程的几大特点: 多线程的执行顺序无法保证,与操作系统的调度策略和线程优先级 ...

  4. QThread多线程编程分析

    QThread多线程编程分析 传统图形界面应用程序都只有一个线程执行,并且一次执行一个操作.如果用户调用一个比较耗时的操作,就会冻结界面响应.一个解决方法是按照事件处理的思路:调用 Void QApp ...

  5. Linux下不使用qt自带sleep,Linux下Qt多线程编程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 作者:武汉华嵌嵌入式培训中心 技术部 以下和大家分享Linux平台下Qt两种多线程编程的方式: 1.使用Linux平台下的线程函数.以下是给出的代码片段: ...

  6. Qt修炼手册11_多线程编程和QThread类

    1.事件循环 学习QT多线程编程之前,有必要先熟悉事件循环的概念. 先看一个单线程界面程序的主函数代码: int main(int argc, char* argv[]) {QApplication ...

  7. Qt多线程编程(一)入门篇

    目录 一.多线程是什么 二.为什么要使用多线程进行开发 1.提高处理效率 2.软件运行更加流畅 3.根据优先级依次处理 三.Qt多线程入门 QThread类,类成员及类成员函数介绍 公有变量 公有函数 ...

  8. Qt的Tcp服务器多线程编程-附带代码展示

    Qt的Tcp服务器多线程编程-附带代码展示 该程序主要实现tcp服务器如何使用多线程的方式来连接多个客户端,此文章没有实现客户端的多线程编程. 创建子线程时需要注意的点: 1.子线程与主线程之间交互数 ...

  9. Qt中多线程间的同步

    文章目录 1 Qt中多线程间的同步 1 Qt中多线程间的同步 多线程编程的本质是什么? 并发性是多线程编程的本质. 在宏观上,所有线程并行执行. 多个线程间相互独立,互补干涉. 常规解决方案设计: 问 ...

最新文章

  1. [导入]使用tomcat5.0自带的连接池
  2. Python基础教程:判断列表重复
  3. asp.net 中的错误处理
  4. linux命令crontab
  5. scrapy框架-post使用
  6. 定制化你的ReactNative底部导航栏
  7. java resultset 赋值_ResultSet数据自动绑定到JavaBean中 | 学步园
  8. 做企业:什么都可以外包么
  9. C#调用自定义表类型参数
  10. Oracle数据库使用Navicat premium创建用户时遇到的坑
  11. 除法运算、商、余数与取模
  12. Hadoop安装教程 Mac版
  13. fiddler抓包视频
  14. HDU6069 欧拉筛法+约数定理+计算技巧。
  15. Word文档进行XXE攻击
  16. python控制苹果手机触摸屏失灵怎么办_苹果手机触摸屏失灵怎么办
  17. ubuntu使用fdisk分区
  18. 实验六201771010101 白玛次仁
  19. Matlab坐标轴标注和特殊字体
  20. 雄安周边各县区限购限贷政策一览2019(持续更新)

热门文章

  1. 关于Criteria
  2. Docker学习(三):复杂软件安装-主从mysql及redis集群
  3. 仅改变rowspan背景_山西耗资10亿的小镇,人称长治“小周庄”,距市中心仅16公里...
  4. staruml 时序图操作
  5. 语义分割代码实现细节:CE_Loss 和 BCE_loss
  6. SpringBoot基于若依项目工时统计成本核算管理源码带文字教程
  7. 图像算法工程师学习内容
  8. 康姿百德 “神奇”床垫包治百病是谣传
  9. 泊松分酒 泊松是法国数学家、物理学家和力学家。他一生致力科学事业,成果颇多。
  10. 基于 WebRTC 的 P2P 文件传输