【浅入浅出】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 测试技术 容器
多线程编程基础与并发问题解决方案
多线程编程基础与并发问题解决方案
|
4天前
|
Java 调度
Java中的线程池机制详解
Java中的线程池机制详解
|
4天前
|
存储 安全 Java
使用Java实现高效的多线程并发控制策略
使用Java实现高效的多线程并发控制策略
|
2天前
|
Java 调度 Windows
Java面试之程序、进程、线程、管程和并发、并行的概念
Java面试之程序、进程、线程、管程和并发、并行的概念
8 0
|
3天前
|
监控 算法 Java
Java虚拟机垃圾收集机制深度解析
在Java的世界中,垃圾收集是确保内存管理高效运行的关键机制之一。本文将深入探讨Java虚拟机的垃圾收集机制,包括其工作原理、常见的垃圾收集算法以及调优实践。我们将基于最新的研究数据和实验结果,提供对垃圾收集器性能的比较分析,并讨论如何根据不同应用场景进行优化。通过逻辑严密的分析,我们旨在为Java开发者提供实用的指导,以帮助他们更好地理解和掌握这一关键技术。
|
4天前
|
安全 Java 程序员
Java多线程编程最佳实践与常见问题解析
Java多线程编程最佳实践与常见问题解析
|
5天前
|
安全 Java 程序员
Java多线程编程最佳实践与常见问题解析
Java多线程编程最佳实践与常见问题解析
|
5天前
|
Java 测试技术 容器
多线程编程基础与并发问题解决方案
多线程编程基础与并发问题解决方案
|
5天前
|
安全 Java UED
Header Location重定向机制解析与应用
Header Location重定向机制解析与应用
|
6天前
|
算法 安全 Java
Java小白教学—五千字带你了解多线程机制及线程安全问题
Java小白教学—五千字带你了解多线程机制及线程安全问题

热门文章

最新文章

推荐镜像

更多