做项目时遭遇用户界面冻结的问题,究其原因是槽函数里装了一个需要CPU密集操作的功能。使用多线程,可以解决界面冻结的问题。

多线程的几大特点:

  1. 多线程的执行顺序无法保证,与操作系统的调度策略和线程优先级等因素有关。
  2. 多线程的切换可能发生在任何时刻、任何地点。
  3. 多线程对代码的敏感度高,因此对代码的细微修改都可能产生意想不到的效果。

先由一个简单的例子引出多线程

先作出这个简单的界面

“开始”对应的槽函数是: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之多线程编程初识相关推荐

  1. 使用Qt的多线程编程

    Qt的多线程编程 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 我们展示了如何将自定义类型与元对象系统集成在一起,使它们能够存储在QVariant对象中,在调试信息 ...

  2. Qt实现多线程编程的两种方式

    Qt实现多线程编程的两种方式 方式一: 继承自QThread类,覆写run函数.此实现方法只有run函数内的代码是运行在子线程内. 代码示例: #ifndef QDEMOTHREAD_H #defin ...

  3. 使用qt实现多线程编程

    目录 1.线程基础 1.1.GUI线程与工作线程 1.2.数据的同步访问 2.QT多线程简介 3.QThread线程类 4.创建并启动线程 QThread类提供不依赖于平台的管理线程的方法.一个QTh ...

  4. QThread多线程编程分析

    QThread多线程编程分析 传统图形界面应用程序都只有一个线程执行,并且一次执行一个操作.如果用户调用一个比较耗时的操作,就会冻结界面响应.一个解决方法是按照事件处理的思路:调用 Void QApp ...

  5. leetcode 多线程编程

    C++多线程学习博客推荐 1    C++11多线程编程----初识 2    c++11多线程编程(二)--理解线程类的构造函数 3    c++11多线程编程(三)--竞争条件与互斥锁 4    ...

  6. Linux下不使用qt自带sleep,Linux下Qt多线程编程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 作者:武汉华嵌嵌入式培训中心 技术部 以下和大家分享Linux平台下Qt两种多线程编程的方式: 1.使用Linux平台下的线程函数.以下是给出的代码片段: ...

  7. Qt修炼手册11_多线程编程和QThread类

    1.事件循环 学习QT多线程编程之前,有必要先熟悉事件循环的概念. 先看一个单线程界面程序的主函数代码: int main(int argc, char* argv[]) {QApplication ...

  8. Qt多线程编程(一)入门篇

    目录 一.多线程是什么 二.为什么要使用多线程进行开发 1.提高处理效率 2.软件运行更加流畅 3.根据优先级依次处理 三.Qt多线程入门 QThread类,类成员及类成员函数介绍 公有变量 公有函数 ...

  9. Qt的Tcp服务器多线程编程-附带代码展示

    Qt的Tcp服务器多线程编程-附带代码展示 该程序主要实现tcp服务器如何使用多线程的方式来连接多个客户端,此文章没有实现客户端的多线程编程. 创建子线程时需要注意的点: 1.子线程与主线程之间交互数 ...

最新文章

  1. 程序经编译连接后变为机器码
  2. Linux---cacti安装后不出图
  3. 秋季海报设计元素|水彩手绘纹理植物素材,从人群中脱颖而出。
  4. 19年计算机专硕学硕报名人数,2019年研招报考数据出炉!专硕的报考人数赶超学硕!...
  5. gb2312编码在线转换_文件打开乱码?来了解一下文件编码
  6. 微信中打开网址添加请在在浏览器中打开提示遮罩
  7. ae 导出html5,AE脚本-导出json格式的Web动画工具 Bodymovin v5.7.0 + 使用教程
  8. 2021国内地址数据库表mysql
  9. 批处理注释bat注释一行_注释和注释处理器入门指南
  10. 高中数学立体几何知识点总结(八大定理)
  11. VoIP技术的基本原理与应用
  12. 基于微信小程序的毕业设计题目(35)PHP医院预约挂号小程序(含开题报告、任务书、中期报告、答辩PPT、论文模板)
  13. Kubernetes基础:使用rollout对Deployment进行控制
  14. DPPO:Distributed Proximal Policy Optimization
  15. 同步,异步,直流电机原理
  16. Ruby学习记录 - 安装Ruby
  17. Python openpyxl下载和安装
  18. QT学习笔记-第三天
  19. 2013年中国android智能手机用户调查研究报告,ZDC:2013年7月中国智能手机市场分析报告...
  20. GNURadio 3.9 使用 OOT 自定义模块问题记录

热门文章

  1. shell处理curl返回数据_linux shell中curl 发送post请求json格式问题的处理方法
  2. Eclipse环境安装Python插件PyDev
  3. 什么是计算机嵌套分类汇总,excel嵌套分类汇总 Excel表格中创建嵌套分类汇总和查看嵌套分类汇总明细的方法...
  4. db设计专用excel_电磁兼容(EMC):工程师必备之硬件EMC设计规范
  5. php 脚本调试,PHP 调试脚本
  6. ETL 工具的比较:Talend,Kettle,Informatica 等
  7. 找出数组中只出现过一次的数
  8. 游戏机制新设计工具(Machinations)工作原理
  9. C#中List的排序(Sort)
  10. postbody传参_java 测试post请求 在body里面传递参数怎么设置,怎么接收