Qt之多线程编程初识
做项目时遭遇用户界面冻结的问题,究其原因是槽函数里装了一个需要CPU密集操作的功能。使用多线程,可以解决界面冻结的问题。
多线程的几大特点:
- 多线程的执行顺序无法保证,与操作系统的调度策略和线程优先级等因素有关。
- 多线程的切换可能发生在任何时刻、任何地点。
- 多线程对代码的敏感度高,因此对代码的细微修改都可能产生意想不到的效果。
先由一个简单的例子引出多线程
先作出这个简单的界面
“开始”对应的槽函数是:slotStart()
“停止”对应的槽函数是:slotStop()
本例中的线程(workthread类)实现的功能是,从0到9循环打印,0至9各占一排。
则该线程的具体实现如下:
#ifndef WORKTHREAD_H
#define WORKTHREAD_H
#include <QThread>class WorkThread : public QThread
{Q_OBJECT
public:WorkThread();protected:void run();};#endif // WORKTHREAD_H
#include "workthread.h"#include <QtDebug>WorkThread::WorkThread()
{}void WorkThread::run()
{while(true){for(int n=0;n<10;n++)qDebug()<<n<<n<<n<<n<<n<<n<<n<<n;}}
好了,现在该在本窗口对象的头文件里添加这个线程属性
private:
WorkThread *workThread[MAXSIZE];
MAXSIZE表示最大生成的线程数,可以根据个人喜好自行选择,只要你的CPU带得动。当然,这里为了展示多线程的特性,我们分别将MAXSIZE置为1及5。
完善之前两个槽函数的功能。
void CH1201::slotStart()
{qDebug() << "slotStart";for (int i = 0; i < MAXSIZE; i++){workThread[i] = new WorkThread();}for (int i = 0; i < MAXSIZE; i++){workThread[i]->start();}ui.startBtn->setEnabled(false);ui.stopBtn->setEnabled(true);
}
void CH1201::slotStop()
{for (int i = 0; i < MAXSIZE; i++){workThread[i]->terminate();workThread[i]->wait();}ui.startBtn->setEnabled(true);ui.stopBtn->setEnabled(false);
}
线程类方法顾名思义大致都能看懂。现在多说两句我自己没怎么接触的:
terminate() 依次终止保存在workThread[]数组中的WorkThread类实例。但是terminate()函数并不会立刻终止这个线程,该线程何时终止取决于操作系统的调度策略。
wait() 使得线程阻塞等待直到退出或超时。
下面观赏一下qDebug()的结果:
下图是MAXSIZE为5是的打印结果,可以看出输出结果是乱序的,我们根本无法猜测操作系统到底是怎么调度这五个线程的。
下图是MAXSIZE为1的打印结果,输出数字顺序有规律,显然只有一个线程在工作。
PS:IDE用的VS2015,我刚开始不知道qDebug打印的调试信息显示在哪里,查了一会儿才知道,qDebug打印的调试信息显示在console。至于调出console的方法也很简单,点击VS左上菜单之一“项目”,选择最下方的“属性”,点击“链接器”,点击“链接器”树下的“系统”,目光移到弹出窗口的中央,更改”子系统“为:”控制台/SUBSYSTEM:CONSOLE“。
Qt之多线程编程初识相关推荐
- 使用Qt的多线程编程
Qt的多线程编程 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 我们展示了如何将自定义类型与元对象系统集成在一起,使它们能够存储在QVariant对象中,在调试信息 ...
- Qt实现多线程编程的两种方式
Qt实现多线程编程的两种方式 方式一: 继承自QThread类,覆写run函数.此实现方法只有run函数内的代码是运行在子线程内. 代码示例: #ifndef QDEMOTHREAD_H #defin ...
- 使用qt实现多线程编程
目录 1.线程基础 1.1.GUI线程与工作线程 1.2.数据的同步访问 2.QT多线程简介 3.QThread线程类 4.创建并启动线程 QThread类提供不依赖于平台的管理线程的方法.一个QTh ...
- QThread多线程编程分析
QThread多线程编程分析 传统图形界面应用程序都只有一个线程执行,并且一次执行一个操作.如果用户调用一个比较耗时的操作,就会冻结界面响应.一个解决方法是按照事件处理的思路:调用 Void QApp ...
- leetcode 多线程编程
C++多线程学习博客推荐 1 C++11多线程编程----初识 2 c++11多线程编程(二)--理解线程类的构造函数 3 c++11多线程编程(三)--竞争条件与互斥锁 4 ...
- Linux下不使用qt自带sleep,Linux下Qt多线程编程
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 作者:武汉华嵌嵌入式培训中心 技术部 以下和大家分享Linux平台下Qt两种多线程编程的方式: 1.使用Linux平台下的线程函数.以下是给出的代码片段: ...
- Qt修炼手册11_多线程编程和QThread类
1.事件循环 学习QT多线程编程之前,有必要先熟悉事件循环的概念. 先看一个单线程界面程序的主函数代码: int main(int argc, char* argv[]) {QApplication ...
- Qt多线程编程(一)入门篇
目录 一.多线程是什么 二.为什么要使用多线程进行开发 1.提高处理效率 2.软件运行更加流畅 3.根据优先级依次处理 三.Qt多线程入门 QThread类,类成员及类成员函数介绍 公有变量 公有函数 ...
- Qt的Tcp服务器多线程编程-附带代码展示
Qt的Tcp服务器多线程编程-附带代码展示 该程序主要实现tcp服务器如何使用多线程的方式来连接多个客户端,此文章没有实现客户端的多线程编程. 创建子线程时需要注意的点: 1.子线程与主线程之间交互数 ...
最新文章
- 程序经编译连接后变为机器码
- Linux---cacti安装后不出图
- 秋季海报设计元素|水彩手绘纹理植物素材,从人群中脱颖而出。
- 19年计算机专硕学硕报名人数,2019年研招报考数据出炉!专硕的报考人数赶超学硕!...
- gb2312编码在线转换_文件打开乱码?来了解一下文件编码
- 微信中打开网址添加请在在浏览器中打开提示遮罩
- ae 导出html5,AE脚本-导出json格式的Web动画工具 Bodymovin v5.7.0 + 使用教程
- 2021国内地址数据库表mysql
- 批处理注释bat注释一行_注释和注释处理器入门指南
- 高中数学立体几何知识点总结(八大定理)
- VoIP技术的基本原理与应用
- 基于微信小程序的毕业设计题目(35)PHP医院预约挂号小程序(含开题报告、任务书、中期报告、答辩PPT、论文模板)
- Kubernetes基础:使用rollout对Deployment进行控制
- DPPO:Distributed Proximal Policy Optimization
- 同步,异步,直流电机原理
- Ruby学习记录 - 安装Ruby
- Python openpyxl下载和安装
- QT学习笔记-第三天
- 2013年中国android智能手机用户调查研究报告,ZDC:2013年7月中国智能手机市场分析报告...
- GNURadio 3.9 使用 OOT 自定义模块问题记录
热门文章
- shell处理curl返回数据_linux shell中curl 发送post请求json格式问题的处理方法
- Eclipse环境安装Python插件PyDev
- 什么是计算机嵌套分类汇总,excel嵌套分类汇总 Excel表格中创建嵌套分类汇总和查看嵌套分类汇总明细的方法...
- db设计专用excel_电磁兼容(EMC):工程师必备之硬件EMC设计规范
- php 脚本调试,PHP 调试脚本
- ETL 工具的比较:Talend,Kettle,Informatica 等
- 找出数组中只出现过一次的数
- 游戏机制新设计工具(Machinations)工作原理
- C#中List的排序(Sort)
- postbody传参_java 测试post请求 在body里面传递参数怎么设置,怎么接收