【浅入浅出】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 编辑

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

相关文章
|
18天前
|
安全
List并发线程安全问题
【10月更文挑战第21天】`List` 并发线程安全问题是多线程编程中一个非常重要的问题,需要我们认真对待和处理。只有通过不断地学习和实践,我们才能更好地掌握多线程编程的技巧和方法,提高程序的性能和稳定性。
127 59
|
26天前
|
Java 开发者
如何通过易语言多线程提升程序响应速度
如何通过易语言多线程提升程序响应速度
129 62
|
13天前
|
安全 程序员 API
|
9天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
19天前
|
Java 开发者
如何通过易语言多线程提升程序响应速度?
如何通过易语言多线程提升程序响应速度?
|
20天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
14 1
|
1月前
|
Java
【编程进阶知识】揭秘Java多线程:并发与顺序编程的奥秘
本文介绍了Java多线程编程的基础,通过对比顺序执行和并发执行的方式,展示了如何使用`run`方法和`start`方法来控制线程的执行模式。文章通过具体示例详细解析了两者的异同及应用场景,帮助读者更好地理解和运用多线程技术。
25 1
|
26天前
|
监控 Java API
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
66 0

热门文章

最新文章

推荐镜像

更多