QT中的多线程有什么作用?

概述

在学习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里的代码块。

这里在线程中延时了五秒

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/399807.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python urllib模块学习

HTTP协议 HTTP 协议:一般指HTTP(超文本传输)协议。 HTTP是为Web浏览器和Web服务器之间的通信而设计的,基于TCP/IP通信协议嘞传递数据。 HTTP消息结构 客户端请求消息 客户端发送一个HTTP请求到服务器的请求消息包括以下格式 请求行(request line)请求…

基于Java开发的个人视频网站的搭建与实现[附源码]

基于Java开发的个人视频网站的搭建与实现[附源码] 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系统 &am…

威来国际教育:留学服务的全新标杆,打造无忧留学体验

在当今全球化日益加深的背景下,留学已成为众多年轻人拓宽视野、提升个人能力的重要手段。随着留学市场的不断扩大和留学目的地的多样化,家庭和学生在选择留学服务时更加注重专业性和全面性。 在这一领域,威来国际教育凭借其深厚的背景和专业的…

mysql 2-20

TEXT类型 枚举类型 SET类型 二进制字符串类型 BLOB类型 注意事项 JSON类型 提取数据 空间类型 选择建议 约束

Spark 离线开发框架设计与实现

一、背景 随着 Spark 以及其社区的不断发展,Spark 本身技术也在不断成熟,Spark 在技术架构和性能上的优势越来越明显,目前大多数公司在大数据处理中都倾向使用 Spark。Spark 支持多种语言的开发,如 Scala、Java、Sql、Python 等。…

创业者看到这3000多箱磁吸春联滞销面临销毁一定要吸取教训!

2月18日,浙江金华一个工厂🏭3000多箱龙年磁吸春联, 因为滞销,加上春联中含有龙元素和日期而面临报废销毁, 造成了数十万的损失以及大量的资源浪费。 —————————— 而引起广泛的社会讨论🗣️&…

《Solidity 简易速速上手小册》第8章:高级 Solidity 概念(2024 最新版)

文章目录 8.1 高级数据类型和结构8.1.1 基础知识解析更深入的理解实际操作技巧 8.1.2 重点案例:构建一个去中心化身份系统案例 Demo:创建去中心化身份系统案例代码DecentralizedIdentityContract.sol 测试和验证拓展案例 8.1.3 拓展案例 1:管…

C++力扣题目 121--买卖股票的最佳时机 122-- 买卖股票的最佳时机II 123--买卖股票的最佳时机III 188--买卖股票的最佳时机IV

121. 买卖股票的最佳时机 力扣题目链接(opens new window) 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所…

基于FPGA的二维DCT变换和逆变换verilog实现,包含testbench

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 数据导入到matlab显示图像 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 timescale 1ns / 1ps // // Company: // Engineer:…

阿里云国际-在阿里云服务器上快速搭建幻兽帕鲁多人服务器

幻兽帕鲁是最近流行的新型生存游戏。该游戏一夜之间变得极为流行,同时在线玩家数量达到了200万。然而,幻兽帕鲁的服务器难以应对大量玩家的压力。为解决这一问题,幻兽帕鲁允许玩家建立专用服务器,其提供以下优势: &am…

如何在Ubuntu部署Emlog,并将本地博客发布至公网可远程访问

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道(云端设置)2.3.Cpolar稳定隧道(本地设置) 3. 公网访问测试总结 前言 博客作为使…

使用Docker部署Docker-Compose-Ui工具并实现公网访问

文章目录 1. 安装Docker2. 检查本地docker环境3. 安装cpolar内网穿透4. 使用固定二级子域名地址远程访问 Docker Compose UI是Docker Compose的web界面。这个项目的目标是在Docker Compose之上提供一个最小的HTTP API,同时保持与Docker Compose CLI的完全互操作性。…

十大顶级电脑分区恢复软件,不用重装系统直接分区磁盘

与分区相关的问题总是令人不愉快,但解决它们并不像看起来那么困难。您只需要使用可用的最佳分区恢复软件,例如本文列出的 10 种解决方案。配备功能强大的分区数据恢复软件,无论分区损坏有多严重,您都应该能够立即恢复数据。 我们如…

【git 使用】使用 git rebase -i 修改任意的提交信息/合并多个提交

修改最近一次的提交信息的方法有很多,可以参考这篇文章,但是对于之前的提交信息进行修改只能使用 rebase。 修改提交信息 假设我们想修改下面这个提交信息,想把【登录】改成【退出登录】步骤如下 运行 git rebase -i head~3 打开了一个文本…

数据结构与算法:栈

朋友们大家好啊,在链表的讲解过后,我们本节内容来介绍一个特殊的线性表:栈,在讲解后也会以例题来加深对本节内容的理解 栈 栈的介绍栈进出栈的变化形式 栈的顺序存储结构的有关操作栈的结构定义与初始化压栈操作出栈操作获取栈顶元…

Fluter学习3 - Dart 空安全

Dart 空安全: 空类型操作符 (?)空值合并操作符 (??)空值断言操作符 (!)延迟初始化 (late) 1、空类型操作符 (?) 当你想要根据一个表达式是否为 null 来执行某个操作时,你可以使用 (?)语法:expression1?.expression2如果 expression1…

关于开放系统互联的一些笔记

最近几天就发几篇计算机方面的基础知识 属于个人归纳整理,便于理解希望对大家有帮助 原文地址:关于开放系统互联的一些笔记 - Pleasure的博客 下面是正文内容: 前言 最近在恶补一些计算机方面的基础知识…… 正文 首先为了能够更透彻的理…

c语言结构体与共用体

前面我们介绍了基本的数据类型 在c语言中 有一种特殊的数据类型 由程序员来定义类型 目录 一结构体 1.1概述 1.2定义结构体 1.3 结构体变量的初始化 1.4 访问结构体的成员 1.5结构体作为函数的参数 1.6指向结构的指针 1.7结构体大小的计算 二共用体 2.1概述 2.2 访…

智慧安防/视频监控汇聚平台EasyCVR如何通过接口调用获取设备录像回看的流地址?

视频云存储/视频融合/安防监控EasyCVR视频汇聚系统可兼容各品牌的IPC、NVR、移动单兵、智能手持终端、移动执法仪、无人机、布控球等设备的接入,支持的接入协议包括:国标GB28181、RTSP/Onvif、RTMP,以及厂家的私有协议与SDK,如&am…

探索在GIS中使用ChatGPT

在创建了一个简单的点击询问 ChatGPT GIS 应用程序之后,我一直在努力想出关于如何在 GIS 应用程序中使用 ChatGPT 和 OpenAI 的更好的主意。后来想到只需要要问问 ChatGPT “如何使用它”,下面是对其中的几个实例。 简单的点击询问应用程序 地理输入和输…