【C++】 Qt-线程进程

news2024/11/18 8:40:39

文章目录

      • 进程(process)
      • 线程(Thread)
      • 创建线程

进程(process)

在任务管理器中能看到进程Tab页下,将所有进程分为三类:

  1. 应用:打开的正在运行的软件。
  2. 后台进程:隐藏到后台,悄悄的运行。
  3. windows进程:操作系统启动、运行需要依赖的各种服务

各种软件、进程是依附在操作系统上运行的。

程序是 存在存储器里面的可执行代码,当我们双击快捷方式时,操作系统就会将代码从存储器中取出来开始执行,并且 给每一个进程分配一个PID。windows操作系统上的应用程序有的是可以开启多个 的,比如说文件夹、浏览器等,有的应用程序 只允许开启一个,比如说 电脑版的微信。手机系统上的APP一般只允许开启 一个。

进程概念:是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立的基本单元,是应用程序运行的载体。

进程是一种抽象的概念,从来没有统一的标准定义。

进程组成:程序、数据集合、进程控制块。

进程具有4个特征:

  1. 动态性:进程是程序的一次执行过程,是临时的,有生命周期的,是动态产生,动态消亡的。
  2. 并发性:任何进程都可以同其他进程一起并发执行。
  3. 独立性:进程是系统进行资源分配和调度的一个独立单元。
  4. 结构性:进程由程序,数据和进程控制块三部分组成。

应用程序和进程间的关系:从任务管理器的详细信息页面可以看出,一个应用程序可以启动多个进程,PID(part ID)是进程唯一标识符,就像人的身份证号。一个应用程序 下的多个进程是树形结构,PID最小的数是根节点。在某一个进程上鼠标右键有一个结束进程树的选项,如果你选择杀死根节点的进程树,将会杀死所有子节点的进程。

线程(Thread)

在早期的操作系统中并没有线程的概念,进程是拥有资源和独立运行的最小单位,也是程序执行的最小单位。后来,随着计算机的发展,对CPU的要求越来越高,进程之间的切换开销较大,已经无法满足越来越复杂的程序的要求了,于是就发明了线程。

线程概念:cpu能够进行调度、分配 、执行、运算的最小基本单位,是程序执行中一个单一的顺序控制流程。一个进程可以有一个或多个线程,各个线程之间共享进程的内存空间。

  1. 进程类似于工厂,是系统分配 资源的基本单元,线程类似于工厂中的工人,是cpu调度和执行工作的基本单元。
  2. 一个进程由一个 或多个线程组成。
  3. 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)。
  4. 调度和切换:线程上下文切换比进程上下文切换要快得多。

为了更快速的完成任务,或者某些场景需要同时做多件事情,就需要使用线程,因为线程可以“同时”执行任务。

这里希望先显示进程 间的切换,再显示线程

- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3FbuQpR3-1688772078589)(C++.assets/image-20230704051159177.png)]

  • 串行:按照顺序,一个执行完再执行下一个。
  • 并行:同一个时刻,指同时执行。
  • 并发:在同一个时间间隔内发生,指相同的时间间隔,交替执行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iZ1SL1ci-1688772078590)(C++.assets/image-20230704051509159.png)]

在单线程下,采用串行的方式执行。

大部分操作系统的任务调度是采用轮换时间片的抢占式调度方式,一个线程执行一小段时间后暂停休息并等待着被唤醒,下一个线程被唤醒并开始执行,每个线程交替轮流执行。线程执行的一小段时间叫做时间片。

由于CPU的执行速度非常快,时间片非常短,在各个线程之间快速地切换,给人的感觉是多个线程在“同时进行”,这就是常说的并发。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P2WAEpdO-1688772078590)(C++.assets/image-20230704051843300.png)]

线程的状态:

  • 新生态:创建出新的线程对象。
  • 就绪态:创建出线程后,进入就绪态,会将线程添加到就绪队列中,等待分配到CPU时间片,就会进入到运行状态。
  • 运行态:运行态的线程如果时间片用完后,就会再次进入就绪状态,一般来说就绪态和运行态不需要人为参与,由操作系统进行调度,如果遇到sleep、wait、suspend、IO请求时,就会进入阻塞态。
  • 阻塞态(挂起状态):一个正在运行的线程在某些特殊情况下,如被人为挂起 或执行耗时的I/O操作时,会让出CPU的使用权并暂时中止自己的执行,进入阻塞状态,处于阻塞状态的线程,就不能进入排队队列。只有当引起阻塞的原因被消除后 ,线程才可以转入就绪状态。当恢复线程,完成IO操作、等到资源,就会进入就绪状态。
  • 销亡态:线程正常执行结束、因异常退出、被强制终止,该进程结束生命周期。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6zCGAJ7g-1688772078591)(C++.assets/image-20230704052825968.png)]

注意:

  1. 线程必须通过就绪态分配到时间片才能进入运行状态,而不能直接进入运行状态。
  2. 就绪状态无法进入阻塞状态。
  3. 其他状态的线程可直接进入销亡态。

创建线程

创建一个Qt控制台项目,在window下使用API函数CreateThread,Header:#include<windows.h>

::CreateThread(nullptr/*默认的安全属性*/,
                   0/*windows 默认1M*/,
                   &ThreadProc/*线程函数的地址*/,
                   &n/*线程函数的参数*/,
                   0/*0:立即运行 ,SUS_PEND 挂起*/,
                   nullptr/*线程ID*/);

通过寻找第三个参数可以找到线程函数

DWORD WINAPI ThreadProc (LPVOID lpThreadParameter){
    int nn = *(int*)lpThreadParameter;
    for(int i=0;i<nn;i++){
        qDebug()<<"挣钱----"<<i;
        Sleep(1000);
    }

    return 0;
}

在主函数中也写一段类似的循环

    for(int i=0;i<20;i++){
        qDebug()<<"-------------------睡觉:"<<i;
        Sleep(1000);
    }

通过测试我们可以发现,我们是创建了一根新的线程,而不是简单的调用线程函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T4w89Mno-1688772078591)(C++.assets/image-20230704055213979.png)]

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

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

相关文章

STM32寄存器点亮LED灯

一&#xff1a; 如何寄存器点灯 1&#xff1a;看单片机的原理图 找到LED灯 这个灯是 PB5引脚 看原理图可以看出 让GPIOB5输出低电平 就能点亮那么我们得让打开控制GPIOB5的时钟让GPIOB5 输出模式让GPIOB5低电平 二&#xff1a;看中文参考手册配置寄存器 2.1&#xff1a;打开管…

python与深度学习——基础环境搭建

一、安装jupyter notebook Jupyter Notebook是一个开源的交互式笔记本环境&#xff0c;可以用于编写和执行代码、创建可视化效果、展示数据分析结果等。我们在这里用它实现代码运行和观察运行结果。安装jupyter notebook实质上是安装Anaconda,后续还要在Anaconda Prompt中使用c…

AI视频智慧安监平台EasyCVR每次重启服务短时间播放后又无法播放,是什么原因?

EasyCVR视频融合平台基于云边端智能协同架构&#xff0c;具有强大的设备接入、视频汇聚管理、全网分发、按需调阅、鉴权播放、智能分析等视频能力与服务。平台开放度高、兼容性强、可支持灵活拓展与第三方集成。 有用户反馈&#xff0c;EasyCVR每次重启服务后&#xff0c;可以短…

操作系统11:虚拟存储器

目录 1、虚拟存储器概述 &#xff08;1&#xff09;常规存储管理方式的特征和局部性原理 1.1 - 常规存储器管理方式的特征 1.2 - 局部性原理 1.3 - 虚拟存储器的基本工作情况 &#xff08;2&#xff09;虚拟存储器的定义和特征 2.1 - 虚拟存储器的定义 2.2 - 虚拟存储器…

【缓存中间件】Redis哈希槽的概念

数据分布理论 分布式数据库首先要解决把整个数据集按照分区规则映射到多个节点的问题&#xff0c;即把数据集划分到多个节点上&#xff0c;每个节点负责整体数据的一个子集。。 需要重点关注的是数据分区规则。常见的分区规则有哈希分区和顺序分区两种&#xff0c;哈希分区离散…

项目集成支付宝报错:调试错误,请回到请求来源地,重新发起请求。 错误代码invalid-app-id错误原因:无效的ApplD参数

问题 项目集成支付宝报错&#xff1a;调试错误&#xff0c;请回到请求来源地&#xff0c;重新发起请求。 错误代码invalid-app-id错误原因:无效的ApplD参数 详细问题 笔者按照支付宝沙箱支付快速集成版进行操作&#xff0c;操作完成访问所集成的支付宝&#xff0c;页面如下 …

微信小程序做登录密码显示隐藏效果

wxml 注意&#xff1a;在html中的input是通过切换type的属性值来实现隐藏显示的 在微信小程序的input里面type没有password属性 是通过password属性的true或者false来设置是否为密码框 <view class"input-item"><text class"tit">密码</…

怎么学习PHP表单处理与验证? - 易智编译EaseEditing

要学习PHP表单处理与验证&#xff0c;可以按照以下步骤进行&#xff1a; 掌握PHP基础知识&#xff1a; 在学习PHP表单处理与验证之前&#xff0c;首先需要对PHP编程语言有基本的了解。学习PHP的语法、变量、数据类型、数组、函数等基础知识是必要的。 学习HTML表单&#xff1…

如何确定活动隔断整体色调

确定活动的整体色调可以通过以下几个步骤&#xff1a; 1. 确定主题或目标&#xff1a;首先要明确活动的主题或目标&#xff0c;这将有助于确定活动需要传达的情感或氛围。 2. 考虑活动类型&#xff1a;根据活动的类型&#xff0c;例如婚礼、生日派对、企业活动等&#xff0c;可…

【代码随想录day4】两两交换链表中的节点

题目 给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&#xff1a;[2,1,4,3] 示例 2&#xff1a; …

高级搜索算法学习笔记

0.前言 如有错误&#xff0c;欢迎各位大佬指出。 前置芝士&#xff1a; 深度优先搜索 广度优先搜索 1.何为高级搜索&#xff1f; 在通常情况下&#xff0c;普通的深搜往往会超时&#xff0c;即使剪枝也无动于衷。对于广搜&#xff0c;我们一旦超时也很难进行优化。 而这…

jenkins+jmeter参数化并发数和循环次数

最近在整合项目的常规性能测试方案&#xff0c;从Metersphere切换回jenkinsjmeter&#xff0c;命令行执行jmeter命令时考虑参数化循环数和并发数&#xff0c;于是总结了一下两种方法&#xff1a; 1、配置文件传参 把并发数和循环次数作为两个参数&#xff0c;通过使用配置元件…

spring-注解开发bean

注解开发bean 使用Component定义bean 在配置文件中通过组建扫描加载bean 3.也可以通过不要配置文件&#xff0c;定义类&#xff0c;使用Configuration&#xff0c;来代替配置文件 基于注解定义bean 1.component,大部分的bean都可以通过这个来定义 1.1Controller&#xf…

JavaScript 将对象数组按字母顺序排序

原文链接&#xff1a;JavaScript 将对象数组按字母顺序排序 这里给出三种解决方案&#xff1a; 1.if条件语句 sort() 2.localeCompare() sort() 3.Collator() sort() sort 用法 语法 array.sort(compareFunction)参数值 参数描述compareFunction可选。定义替代排序顺序…

01-vue的核心和传统开发的区别

前端行业历史发展 &#x1f355;&#x1f355;&#x1f355;最早的网页是没有数据库的&#xff0c;可以理解为在网络上一张 报纸&#xff0c;直到CGI技术的出现&#xff0c;运行一小段代码与数据库或文件 系统进行交互&#xff0c;如98年的 Google Asp,JSP的出现&#xff0…

vscode编写stm32代码

vscode编辑keil项目&#xff0c;无需复杂步骤 keil开发是挺难用的&#xff0c;vscode又是编辑神器&#xff0c;keil调试vscode编辑代码可以大幅度提高效率&#xff0c;因此可以借用vscode来编辑代码。 1安装c插件 安装c与extension pack插件 2配置c_cpp_properties.json文…

OSI参考模型通信处理例子【图解TCP/IP(笔记四)】

文章目录 OSI参考模型通信处理举例7层通信■ 应用层■ 表示层■ 会话层■ 传输层■ 网络层■ 数据链路层、物理层 OSI参考模型通信处理举例 下面举例说明7层网络模型的功能。假设使用主机&#xff08;这里所指的主机是指连接到网络上的计算机。按照OSI的惯例&#xff0c;进行通…

C++——this指针

1.什么是this指针&#xff1f; this指针是C中的一个特殊指针&#xff0c;它指向当前对象的地址。在类的成员函数中&#xff0c;this指针可以用来访问当前对象的成员变量和成员函数。this指针的作用是区分同名的成员变量和局部变量&#xff0c;以及在成员函数中访问其他成员函数…

C# PaddleOCR ch_PP-OCRv3 ch_PP-OCRv4测试

效果 未开启Onnx,V3 未开启Onnx,V4 开启Onnx,V3 开启Onnx,V4 项目 VS2022.net 4.8OpenCvSharp4 Sdcb.PaddleInference/2.5.0-preview.1 Sdcb.PaddleOCR/2.6.0.6-preview.1 代码 using OpenCvSharp; using Sdcb.PaddleInference; using Sdcb.PaddleOCR; using Sdcb.Paddle…

Spark—通过Java、Scala API实现WordCount案例的基本操作

实验原理 Spark的核心就是RDD&#xff0c;所有在RDD上的操作会被运行在Cluster上&#xff0c;Driver程序启动很多Workers&#xff0c;Workers在&#xff08;分布式&#xff09;文件系统中读取数据后转化为RDD&#xff08;弹性分布式数据集&#xff09;&#xff0c;然后对RDD在…