【浅入浅出】Qt多线程机制解析:提升程序响应性与并发处理能力

简介: 在学习QT线程的时候我们首先要知道的是QT的主线程,也叫GUI线程,意如其名,也就是我们程序的最主要的一个线程,主要负责初始化界面并监听事件循环,并根据事件处理做出界面上的反馈。但是当我们只限于在一个主线程上书写逻辑时碰到了需要一直等待的事件该怎么办?它的加载必定会带着主界面的卡顿,这时候我们就要去使用多线程。


目录

概述

1. 使用多线程有什么好处?

1.1 提高应用界面的响应速度。

1.2 使多核心CPU系统更加有效。

1.3 改善程序结构。

2. 线程编程流程

3. 编程实例


概述

在学习QT线程的时候我们首先要知道的是QT的主线程,也叫GUI线程,意如其名,也就是我们程序的最主要的一个线程,主要负责初始化界面并监听事件循环,并根据事件处理做出界面上的反馈。但是当我们只限于在一个主线程上书写逻辑时碰到了需要一直等待的事件该怎么办?它的加载必定会带着主界面的卡顿,这时候我们就要去使用多线程。

1. 使用多线程有什么好处?

1.1 提高应用界面的响应速度。

这对于开发图形界面程序尤其重要,当一个操作耗时很长时(比如大批量I/O或大量矩阵变换CPU密集操作),整个系统都会等待这个操作,程序就不能响应键盘、鼠标、菜单等操作,而使用多线程技术可将耗时长的操作置于一个新的线程,从而不会影响到主GUI线程,从而避免上述问题。

1.2 使多核心CPU系统更加有效。

当线程数不大于CPU核数时,操作系统可以调度不同的线程运行于不同的CPU核上。

1.3 改善程序结构。

一个既长又复杂的进程可以考虑分为多个线程,成为独立或半独立的运行部分,这样有利于程序的理解和维护。

2. 线程编程流程

a. 子类化QThread:重写一个类,继承自QThread。

b. 重写 run 函数,run函数内有一个 while 或 for 的循环:执行耗时操作。

c. 子线程类实现公共方法,供主线程传参。主线程调用start方法开始子线程。

d. 设置一个标记为来控制循环的退出,或者父线程调用terminate停止子线程。

e. 设置必要的信号和槽做连接--子线程给主线程传参

注意:所有的界面操作都必须在GUI主线程来进行,子线程是不允许操作界面上的任何部件!

3. 编程实例

QThread 类

Public Functions
  QThread(QObject *parent = 0) //构造函数  //pthread_create
  bool    isFinished() const  //判断线程是否退出
  bool    wait(unsigned long time = ULONG_MAX)   //pthread_join(&id)
  //等待某个线程结束,最多等待time ms,如果时间没有设置,那么永远等待。
Public Slots
  void  start(Priority priority = InheritPriority)  //启动线程必须使用start
  void  terminate()-->杀死线程  //pthread_cancel
Static Public Members
  Qt::HANDLE  currentThreadId() [static] //得到当前执行者线程ID,可以直接qDebug
  void  sleep(unsigned long secs) [static]
  void  msleep(unsigned long msecs) [static]
  void  usleep(unsigned long usecs) [static]
  睡眠函数不能在主线程调用,会造成界面卡死。
Protected Functions 
  virtual void run();  //启动新线程不能直接调用run,需要调用start接口,
            //start会启动新线程,然后执行run里的代码块。

image.gif

image.gif 编辑 image.gif 编辑

image.gif 编辑

这里在线程中延时了五秒

image.gif 编辑

因为是视频,就不好放了,感兴趣的可以去试一试,结果的话就是LcdNumber一直在增加。

image.gif 编辑

关于线程还有很多使用的方法,这里也只是写了一个线程,实际运用中我们应该会使用多线程进行操作,大家可以自行发挥。

相关文章
|
3天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
14 2
|
5天前
|
存储 消息中间件 算法
深入探索操作系统的心脏——内核机制解析
本文旨在揭示操作系统核心——内核的工作原理,通过剖析其关键组件与机制,为读者提供一个清晰的内核结构图景。不同于常规摘要的概述性内容,本文摘要将直接聚焦于内核的核心概念、主要功能以及其在系统管理中扮演的角色,旨在激发读者对操作系统深层次运作原理的兴趣与理解。
|
15天前
|
安全 程序员 API
|
11天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
17天前
|
存储 缓存 安全
🌟Java零基础:深入解析Java序列化机制
【10月更文挑战第20天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
21 3
|
19天前
|
存储 关系型数据库 MySQL
MySQL MVCC深度解析:掌握并发控制的艺术
【10月更文挑战第23天】 在数据库领域,MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种重要的并发控制机制,它允许多个事务并发执行而不产生冲突。MySQL作为广泛使用的数据库系统,其InnoDB存储引擎就采用了MVCC来处理事务。本文将深入探讨MySQL中的MVCC机制,帮助你在面试中自信应对相关问题。
56 3
|
22天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
15 1
|
4月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
178 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
3月前
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
88 0
|
2月前
|
开发工具 C++
qt开发技巧与三个问题点
本文介绍了三个Qt开发中的常见问题及其解决方法,并提供了一些实用的开发技巧。

推荐镜像

更多