Qt开发-----线程调度

 目录

 前言

一、Linux下查看进程的情况

二、线程的创建

三、多线程的创建和使用


 前言

以下引用内容源自正点原子Qt开发指南文档。

        我们写的一个应用程序,应用程序跑起来后一般情况下只有一个线程,但是可能也有特殊情况。比如我们前面章节写的例程都跑起来后只有一个线程,就是程序的主线程。线程内的操作都是顺序执行的。恩,顺序执行?试着想一下,我们的程序顺序执行,假设我们的用户界面点击有某个操作是比较耗时的。您会发现界面点击完了,点击界面对应的操作还没有完成,所以就会冻结界面,不能响应,直到操作完成后,才返回到正常的界面里。如果我们的界面是这么设计的话,估计用户得发毛了。
        这种情况我们一般是创建一个单独的线程来执行这个比较耗时的操作。比如我们使用摄像头拍照保存照片。恩,很多朋友问,这个不算耗时吧。对的在电脑上使用 Qt 拍照,处理起来非常快。根本也不需要开启一个线程来做这种事。但是我们是否考虑在嵌入式的 CPU 上做这种事情呢?嵌入式的 CPU 大多数都没有电脑里的 CPU 主频(几 GHz)那么高,处理速度也不快。此时我们就需要考虑开多一个线程来拍照了。拍完照再与主线程(主线程即程序原来的线程)处理好照片的数据,就完成了一个多线程的应用程序了。
        官方文档里说,QThread 类提供了一种独立于平台的方法来管理线程。QThread 对象在程序中管理一个控制线程。QThreads 在 run()中开始执行。默认情况下,run()通过调用 exec()来启动事件循环,并在线程中运行 Qt 事件循环。您可以通过使用 QObject::moveToThread()将 worker对象移动到线程来使用它们。QThread 线程类是实现多线程的核心类。Qt 有两种多线程的方法,其中一种是继承 QThread的 run()函数,另外一种是把一个继承于 QObject 的类转移到一个 Thread 里。Qt4.8 之前都是使用继承 QThread 的 run()这种方法,但Qt4.8 之后,Qt 官方建议使用第二种方法。两种方法区别不大,用起来都比较方便,但继承 QObject 的方法更加灵活。所以 Qt 的帮助文档里给的参考是先给继承 QObject 的类,然后再给继承 QThread 的类。

一、Linux下查看进程的情况

  • 进程 (Process)

    • 进程是操作系统中资源分配的基本单位,代表一个正在执行的程序。每个进程都有自己的内存空间、系统资源(如文件描述符)和运行状态。
    • 一个进程可以包含一个或多个线程。
  • 线程 (Thread)

    • 线程是进程中执行的最小单位。一个线程是一个轻量级的执行单元,多个线程共享同一进程的内存空间和资源。
    • 线程之间的切换通常比进程切换更快,因为它们共享同一进程的上下文和资源,减少了上下文切换的开销。

总的来说,线程是CPU调度的最小单位,一个进程至少是有一个线程当然也可以有多个线程。这里打开你的命令行窗口( Ctrl+Alt+T),然后这里输入如下,查看当前系统的进程情况。

ps -aux

然后创建一个Qt项目,下面是这个按钮的槽函数,很显然当我们点击之后就会进到这个死循环里面去。

void Widget::on_pushButton_clicked()
{qDebug()<<"click"<<endl;while(1){}qDebug()<<"over"<<endl;
}

在你的Qtcreator去点击运行。

然后在命令行窗口输入:

ps -aux | grep QThread//QThread是Qt程序名字

 这条指令是查找名字为QThread的进程

这里就看到我这个进程的PID为8455,然后我要去查看这个进程下有哪些子进程。

ps -m 8455

ps -m 是 Linux 中用于显示当前进程及其线程的命令。具体来说,它显示了与指定进程相关的线程的信息。这条命令可以帮助你查看进程的线程状态和相关信息。 

这里就可以看到这个Qt程序带有另外的五个子线程,第一个是表示主线程,剩下几个是这个进程的分支也就是子线程。

然后回到你的QTcreator,点击这个按钮,然后就是卡死的情况了,这个程序就阻塞了。

好了现在就要处理这个东西了,这里就可以去用线程来去处理。

二、线程的创建

class MyThread : public QThread{Q_OBJECT
public:MyThread(QWidget* parent=nullptr){Q_UNUSED(parent);}~MyThread(){qDebug()<<"die"<<endl;}void run() override{qDebug()<<"start "<<endl;while(1){}deleteLater();}
};
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) //: QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//sadasdwmythread= new MyThread(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{mythread->start();
}

这里在Widget调用构造函数的时候就创建了这个线程,当我们去点击按钮的时候就是线程的开始。这里就可以实现不出现卡死,这就是线程的调度。

三、多线程的创建和使用

Widget.h代码:

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QThread>
#include <QtDebug>
class MyThread;QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::Widget *ui;MyThread* mythread;
};class MyThread : public QThread{Q_OBJECT
public:MyThread(QWidget* parent=nullptr){Q_UNUSED(parent);}~MyThread(){qDebug()<<"die"<<endl;}void run() override{qDebug()<<"start "<<endl;msleep(5000);qDebug()<<"over "<<endl;deleteLater();}
};#endif // WIDGET_H

这里我有一个MyThread线程的类,这个类重写了父类run()方法,当线程开启的时候这个就会调用这个方法。当run方法执行到最后一行的时候要用deleteLater()来去把这个线程的对象删除掉,否则堆区的内存就会无法释放。

下面是Widget.cpp文件

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) //: QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//sadasdw//mythread= new MyThread(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{// mythread->start();MyThread *testThread = new MyThread(this);testThread->start();
}

这里就是点击一个按钮就会开启一个线程,每次点击之后都会去开启线程,这就是多线程的创建。

今日壁纸: 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

让你的单细胞数据动起来!|iCellR(一)

今天在翻阅single cell 的github时候&#xff0c;我看见了这个R包&#xff0c;允许我们处理各种来自单细胞测序技术的数据&#xff0c;如scRNA-seq&#xff0c;scVDJ-seq和CITE-Seq。 单细胞转录组教程汇总 想看整套的学习流程还可以戳这里&#xff1a; https://vimeo.com/3…

CSS综合案例——新闻详情

一、知识点 1、文字颜色 属性名&#xff1a;color 属性值&#xff1a; 颜色表示方式属性值说明使用场景颜色关键字颜色英文单词red,green,blue学习测试rgb表示法rg(r,g,b)r,g,b表示红绿蓝三原色&#xff0c;取值0-255了解rgba表示法rgba(r,g,b,a)a表示透明度&#xff0c;取…

sed工具的基本使用

文章目录 sed工具介绍什么是sed工具&#xff0c;有什么用sed命令执行流程sed是按行读取文件的每当读取一行内容&#xff0c;都会进行一次判断&#xff0c;判断是否是想要的行默认不实质改变文件内容&#xff0c;仅临时输出给用户看&#xff08;除非加-i选项&#xff09;例1 例2…

1024 程序员节:代码铸就的科技传奇,节日快乐

一、1024 程序员节的起源与发展 国际程序员节起源于俄罗斯&#xff0c;其设立的日期是每年的第 256 天&#xff0c;平年为 9 月 13 日&#xff0c;闰年为 9 月 12 日。256 这个数字对程序员来说意义非凡&#xff0c;1 个字节等于 8 位元&#xff0c;最多能表示 256 个数值&…

[LeetCode] 230. 二叉搜索树中第K小的元素

题目描述&#xff1a; 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 小的元素&#xff08;从 1 开始计数&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,null,2], k 1 输出&#xff1a;1示例 2&am…

河源市社保卡照片要求及手机自拍拿数码相片回执的方法

河源市的居民在申请或更新社保卡时&#xff0c;需要提交一张符合特定要求的照片。如果您需要更新或申请社保卡&#xff0c;本文将为您详细介绍河源市社保卡照片的规格要求&#xff0c;并指导您如何通过手机自拍获取符合标准的社保卡照片及回执。 根据河源市社保局的指南&#x…

jconsole或者jvisual连接服务器Java进程

java -Djava.rmi.server.hostname你的ip-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port一个新的端口&#xff0c;不能和项目端口一样-Dcom.sun.management.jmxremote.sslfalse -Dcom.sun.management.jmxremote.authenticatefalse -Dcom.sun.management.j…

深度解读:Spring.3版本自动装配机制的演变与实践

前言 今天&#xff0c;我们将开启对Spring-AI系列源码的讲解。请大家不急不躁&#xff0c;我会逐步深入&#xff0c;每次专注于一个知识点&#xff0c;以防让人感到困惑。 首先&#xff0c;源码的讨论自然离不开自动装配。有人可能会问&#xff0c;之前已经讲解过这个内容了&…

【CVPR 2025】1 论文模板中文版详细指南:从格式到提交要求

【CVPR 2025】1 论文模板中文版详细指南&#xff1a;从格式到提交要求 写在最前面1. 论文类型和使用的模板2. 摘要部分格式3. 论文正文格式要求4. 页边距和页码设置5. 标题与字体规范6. 数学公式和引用7. 脚注与参考文献8. 图表与颜色的使用9. 最终版本提交要求10. 补充材料的处…

一、Python基础语法(有C语言基础速成版)

在python中&#xff0c;变量是没有类型的&#xff0c;变量存储的数据是有类型的 可以把变量当做一个存放物品的盒子 一、字面量 字面量&#xff1a;在代码中&#xff0c;被写下来的 固定的值 python中常见的值的类型 二、注释 # 我是单行注释&#xff0c;一般要加个空格&a…

1024程序员日,让世界没有BUG!

近年来&#xff0c;电子商务、远程教育、智慧城市、智慧医疗等计算机互联网的新应用不断涌现且蓬勃发展。信息技术日益广泛地深入到社会生产、生活中各个领域。IT产业在数字化革命浪潮中&#xff0c;则以更高、更快、更强的速度向前发展着。这些都离不开程序员在背后默默付出。…

通过热成像技术在地球之外成长,在教室之外学习

“有了正确的心态&#xff0c;任何年龄的人都可以成为科学家” 。这是一位老师通过一项名为“Growing Beyond Earth”的研究项目教他六年级学生的内容&#xff0c;这让他们有机会测试不同植物在空间站上生长的可行性。借助科学方法和热成像相机等专业测量工具&#xff0c;这些学…

STM32实现毫秒级时间同步

提起“时间同步”这个概念&#xff0c;大家可能很陌生。一时间搞不清楚是什么意思。 我理解“时间同步”可以解决多个传感器采集数据不同时的问题&#xff0c;让多个传感器同时采集数据。 打个比方。两个人走路&#xff0c;都是100毫秒走一步&#xff08;频率相同是前提&…

面试总结一

面试总结 1、自我介绍一下自己2.面试11、css常用布局有哪些2、css常用的属性3.js原型链4、开发中遇到的技术难点5、闭包6、ts了解什么呢7.git都用什么命令8、vue怎么打包9.vue启动一个项目需要什么10、vue怎么创建一个项目 2.面试21.vue2和vue3有什么区别2.复杂组件的封装&…

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【DSP指令加速篇】

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【DSP指令加速篇】 一、前文回顾二、CMSIS-NN简介2.1 为什么介绍CMSIS-NN&#xff1f;2.2 CMSIS-NN是什么&#xff1f;2.3 CMSIS-NN核心特性2.4 CMSIS-NN算子支持 三、TFLMCMSIS-NN集成3.1 包含TFLM的STM32项目3.2 理解TFLM…

vscode使用法则及神器介绍

目录 1.Vscode设置中文 2.文插件选择configure display Language 3.插件 4.代码格式化 5.创建代码模板 一个好的插件&#xff0c;可以快速提高优秀程序猿的工作效率&#xff0c;减少开发时间&#xff1b; 1.Vscode设置中文 首先打开VSCode软件 快捷键【CtrlShiftP】 2.…

基于neo4j的医疗图谱问答与展示

找不到好的毕业设计题材&#xff1f;或者对人工智能领域感兴趣却不知道如何下手&#xff1f;这里给大家推荐一款基于Neo4j的医疗图谱问答系统项目&#xff0c;绝对是毕业设计的不二选择。 这个项目依托于医疗领域的知识图谱&#xff0c;为用户提供交流问答系统。它不仅具有知识…

3DsMax删除FBX 导出的预设

3DsMax删除FBX 导出的预设 文档 https://help.autodesk.com/view/3DSMAX/2025/CHS/?guidGUID-9939F041-5E2D-4AA8-A732-6C2A1DFB5314删除静态FBX 这个预设 使用everything 搜索预设文件的后缀.fbxexportpreset &#xff0c;然后 文件路径 C:\Users\GoodCooking\Documents\3…

GPU 与 GPU 服务器:科技璀璨之星,开启无限未来

今天咱们要来聊聊在科技领域中闪闪发光的 GPU 和 GPU 服务器。这可真是一对厉害的 “科技搭档”&#xff0c;正以其卓越的性能成为众多行业发展的强大动力源。 先来说说 GPU 吧。它呀&#xff0c;一开始是为了满足图形处理的高要求而诞生的。但随着科技不断进步&#xff0c;人…

WRF-LES与PALM微尺度气象大涡模拟

针对微尺度气象的复杂性&#xff0c;大涡模拟&#xff08;LES&#xff09;提供了一种无可比拟的解决方案。微尺度气象学涉及对小范围内的大气过程进行精确模拟&#xff0c;这些过程往往与天气模式、地形影响和人为因素如城市布局紧密相关。在这种规模上&#xff0c;传统的气象模…