当前位置: 首页 > news >正文

c++ qt--线程(一)(第八部分)

c++ qt–线程(一)(第八部分)

一.进程(Process)

在任务管理器中的进程页下,可以看到进程,任务管理器将进程分为了三类,应用、后台进程、window进程

在这里插入图片描述

应用:

打开的正在运行的软件

后台进程:

隐藏在后台,“悄悄”的运行

window进程:

操作系统启动、运行需要依赖的各种服务

1.进程的概念

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

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

2.进程的组成

进程由程序、数据集合、进程控制块三部分组成

3.进程的4个特征

1.动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生。动态消亡的

2.并发性:任何进程都可以同其他进程一起并发执行

3.独立性:进程是程序进行资源分配和调度的一个独立单元

4.结构性:进程由程序、数据集合、进程控制块三部分组成

4.应用程序和进程间的关系

一个应用程序下的多个进程是树形结构。

PID是进程的唯一标识符,PID最小的数是根节点

二.线程(Thread)

1.线程的概念

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

2.线程的串行,并行和并发

串行:按照顺序。一个执行完再执行下一个

并行:同一个时刻,同时进行

并发:再同一个时间间隔内发生,指相同的时间间隔,交替执行

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

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

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

3.线程的状态

1.新生态:创建出新的线程对象

2.就绪态:创建出线程后,进入就绪态,会将线程添加到就绪队列中,等待分配到cpu时间片,就会进行运行状态

3.运行态:运行态的线程如果时间片用完后,就会再次进入就绪状态,一般来说就绪态和运行态不需要认为参与,由操作系统进行调度,如果遇到sleep、wait、suspend、IO请求时就会进入阻塞态

4.阻塞态(挂起状态):一个正在运行的线程在某些特殊情况下,如被认为挂起或执行好事的I/O操作时,会让出cpu的使用权并暂时中止自己的执行,进入阻塞状态,处于阻塞状态的线程,就不能进入排队队列。只有当引起阻塞的原因被消除后,线程才可以转入就绪状态。当恢复线程,完成IO操作、等到资源,就会进入就绪状态

5.销亡态:线程正常执行结束、因异常退出、被强制终止,该线程结束生命周期

注意:

1.线程必须通过就绪态分配到时间片才能进入运行状态,而不能直接进入运行状态

2.就绪状态无法进入阻塞状态

3.其他状态的线程可直接进入销亡态

三.使用QT创建线程(进一步理解线程)

1.创建一个控制台窗口

在这里插入图片描述

2.创建线程

1.使用的头文件为

#include <windows.h>

2.创建线程

在main.cpp中的mian函数中写下面代码

int n=20;
//创建一个子线程,主线程可以看作是main函数 的执行
HANDLE handle=::CreateThread(nullptr/*使用默认的安全属性*/,//线程的安全属性,返回的是线程句柄,这里我们用线程句柄接一下0//用默认的线程栈大小window(1M),&ThreadProc//线程函数,&n//线程函数传递的参数,0//创建线程后,0:立即执行,CREATE_SUSPENDED:挂起,nullptr//返回线程ID);

3.线程函数

在main.cpp中写下面代码

DWORD (WINAPI/*调用约定*/ ThreadProc) (LPVOID/* void* */ lpThreadParameter){return 0;//表示当前函数正常退出
}

4.通过输出观察两个线程的执行

主线程
int n=20;
//创建一个子线程,主线程可以看作是main函数 的执行
HANDLE handle=::CreateThread(nullptr/*使用默认的安全属性*/,//线程的安全属性,返回的是线程句柄,这里我们用线程句柄接一下0//用默认的线程栈大小window(1M),&ThreadProc//线程函数,&n//线程函数传递的参数,0//创建线程后,0:立即执行,CREATE_SUSPENDED:挂起,nullptr//返回线程ID);//进行一个输入,看主线程与子线程的关系
for(int i=0;i<20;i++){qDebug()<<"--------------------------------主人 睡了"<<i;Sleep(1000);
}
子线程
DWORD (WINAPI/*调用约定*/ ThreadProc) (LPVOID/* void* */ lpThreadParameter){//进行一个输入,看主线程与子线程的关系int n=*(int*)lpThreadParameter;//将void*强转为int*最后取其中的值for(int i=0;i<n;i++){qDebug()<<"仆人在挣钱"<<i;Sleep(1000);}return 0;//表示当前函数正常退出
}

5.线程的挂起、恢复操作(这里对子线程挂起和恢复操作)

主线程

在main.cpp中的mian函数中写下面代码

int n=20;HANDLE handle=::CreateThread(nullptr,0,&ThreadProc,&n/,CREATE_SUSPENDED//这里改为了CREATE_SUSPENDED,挂起,nullptr);for(int i=0;i<20;i++){if(i==3){//返回的是恢复或挂起之前 挂起计数器的值,当挂起计数器的值为0时,线程才能继续运行//挂起几次,就得恢复几次,线程才能继续运行DWORD count=::ResumeThread(handle);//恢复某一个线程运行qDebug()<<"count111   "<<count;}if(i==7){DWORD count=::SuspendThread(handle);qDebug()<<"count222   "<<count;}if(i==10){DWORD count=::SuspendThread(handle);qDebug()<<"count333    "<<count;}if(i==13){DWORD count=::ResumeThread(handle);qDebug()<<"count444    "<<count;}if(i==15){DWORD count=::ResumeThread(handle);qDebug()<<"count555    "<<count;}qDebug()<<"--------------------------------主人 睡了"<<i;Sleep(1000);
}
子线程

在main.cpp中写下面代码

DWORD (WINAPI/*调用约定*/ ThreadProc) (LPVOID/* void* */ lpThreadParameter){//进行一个输入,看主线程与子线程的关系int n=*(int*)lpThreadParameter;//将void*强转为int*最后取其中的值for(int i=0;i<n;i++){qDebug()<<"仆人在挣钱"<<i;Sleep(1000);}return 0;//表示当前函数正常退出
}

6.线程的关闭和退出操作()

定义两个关于退出标志
bool isTreadQuit=false;//退出的标志,这里初始是不退出
bool isAlreadyQuit=false;//告诉主线程退出了,这里初始是不告诉
主线程

在main.cpp中的mian函数中写下面代码

int n=20;//创建第一个线程时也会创建内核对象,这时使用计数默认+1
HANDLE handle=::CreateThread(nullptr,0,&ThreadProc,&n/,0//这里改为了0,立即执行,nullptr);for(int i=0;i<20;i++){qDebug()<<"--------------------------------主人 睡了"<<i;if(i==6){isTreadQuit=true;qDebug()<<"通知子线程退出";break;}//第一种 一直等子线程退出的标记//while(1){//    if(isAlreadyQuit){//         qDebug()<<"收到子线程退出的标记了";//         break;//    }//    Sleep(1000);//}//第二种,设置等待时间等子线程退出,这里设置的是7秒DWORD flag=WaitForSingleObject(handle,7000);//这里的参数单位是毫秒if(flag==WAIT_OBJECT_0){//在设定的等待时间内,子线程正常退出了qDebug()<<"子线程退出了";}else if(flag==WAIT_TIMEOUT){//在设定的等待时间内,子线程没有退出,等待超时了qDebug()<<"等待超时,强制杀死线程";::TerminateThread(handle,-1);//强制杀死子线程,有风险的方式}if(handle){::CloseHandle(handle);//关闭句柄,使用计数-1,当使用计数减为0的时候系统就会回收内核对象·}handle=nullptr;Sleep(1000);
}
子线程

在main.cpp中写下面代码

DWORD (WINAPI/*调用约定*/ ThreadProc) (LPVOID/* void* */ lpThreadParameter){int n=*(int*)lpThreadParameter;while(!isTreadQuit){qDebug()<<"仆人在挣钱";Sleep(1000);}//第一种//isAlreadyQuit=true;return 0;
}

相关文章:

c++ qt--线程(一)(第八部分)

c qt–线程&#xff08;一&#xff09;&#xff08;第八部分&#xff09; 一.进程&#xff08;Process&#xff09; 在任务管理器中的进程页下&#xff0c;可以看到进程&#xff0c;任务管理器将进程分为了三类&#xff0c;应用、后台进程、window进程 应用&#xff1a; 打开…...

参数初始化方法

梯度消失与梯度爆炸 考虑一个 3 层的全连接网络。 H 1 X W 1 H{1}X \times W{1} H1XW1&#xff0c; H 2 H 1 W 2 H{2}H{1} \times W{2} H2H1W2&#xff0c; O u t H 2 W 3 OutH{2} \times W_{3} OutH2W3​ 其中第 2 层的权重梯度如下&#xff1a; Δ W 2 ∂ L o s s …...

Go的基础运行方式和打包

目录 基础运行方式导入路径 打包技巧相关知识点 基础运行方式 // 文件名可以不是main&#xff0c;但包名和入口函数比如是main // main.go package main // 导入包的时候可以直接导入&#xff0c;也可以导入后指定包名&#xff0c; import ("fmt"godemo "githu…...

Deepin 图形化部署 Hadoop Single Node Cluster

Deepin 图形化部署 Hadoop Single Node Cluster 升级操作系统和软件 快捷键 ctrlaltt 打开控制台窗口 更新 apt 源 sudo apt update更新 系统和软件 sudo apt -y dist-upgrade升级后建议重启 开启ssh服务 打开资源管理器 进入系统盘 找到 etc 目录 在系统盘的 etc 目录上 右键…...

23款奔驰GLS400升级柏林之声音响系统,体验不一样的感觉

Burmester 环绕立体声音响系统–为每位乘员打造令人印象深刻的音质13个高性能扬声器、总功率为590瓦的9声道数字信号处理器(DSP)放大器以及放大器/扬声器系统专为车辆配置&#xff0c;打造出一流的Burmester之音。必要时还可进一步提升令人印象深刻的听觉体验。声音环绕功能能够…...

Vue的map()方法和filter()方法的使用

map() map()&#xff1a;方法返回一个新数组&#xff0c;数组中的元素为原始数组元素调用函数处理后的值 案例&#xff1a; const data res.map(item > item.id); const data res.map(item > return item.id); const data res.map(item > { name: item.name, id…...

qt创建临时文件

1、临时文件系统 在 Linux 系统中&#xff0c;创建临时文件系统很简单&#xff0c;执行如下指令即可&#xff1a; mount -t tmpfs -o size1024m tmpfs /mnt/tmp 挂载成功后&#xff0c;在 /mnt/tmp 这个挂载点下创建的所有文件都将会是临时文件, 也就是说&#xff1a;当电脑关…...

Element——table排序,上移下移功能。及按钮上一条下一条功能

需求&#xff1a;table排序&#xff0c;可操作排序上移下移功能。判断第一行上移禁用和最后一行下移禁用&#xff0c;排序根据后端返回的字段 <el-table:data"tableData"style"width: 100%"><el-table-column type"index" label"序…...

无涯教程-Android - Linear Layout函数

Android LinearLayout是一个视图组&#xff0c;该视图组将垂直或水平的所有子级对齐。 Linear Layout - 属性 以下是LinearLayout特有的重要属性- Sr.NoAttribute & 描述1 android:id 这是唯一标识布局的ID。 2 android:baselineAligned 此值必须是布尔值&#xff0c;为…...

ELK安装、部署、调试(六) logstash的安装和配置

1.介绍 Logstash是具有实时流水线能力的开源的数据收集引擎。Logstash可以动态统一不同来源的数据&#xff0c;并将数据标准化到您选择的目标输出。它提供了大量插件&#xff0c;可帮助我们解析&#xff0c;丰富&#xff0c;转换和缓冲任何类型的数据。 管道&#xff08;Logs…...

【Spring Security】UserDetails 接口介绍

文章目录 UserDetails 的作用UserDetails 接口中各个方法详解 UserDetails 的作用 UserDetails 在 Spring Security 框架中主要担任获取用户信息的接口&#xff0c;通过该接口就能拿到用户的信息和验证用户的信息&#xff0c;这些信息在下面的方法中会有讲述。 UserDetails 接…...

C# Linq源码分析之Take(四)

概要 本文主要对Take的优化方法进行源码分析&#xff0c;分析Take在配合Select&#xff0c;Where等常用的Linq扩展方法使用时候&#xff0c;如何实现优化处理。 本文涉及到Select, Where和Take和三个方法的源码分析&#xff0c;其中Select, Where, Take更详尽的源码分析&…...

Python 和 C++ 使用细节差别

1. 循环中的可迭代对象长度 1. 循环中的可迭代对象长度 C 中&#xff0c;for循环中写明a.size()&#xff0c;每次循环这个值是重新计算的&#xff1b; # include “iostream” # include <vector> using namespace std;int main() {vector<int> a(10);int cnt 0…...

在Ubuntu Linux系统上安装RabbitMQ服务并解决公网远程访问问题

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…...

葫芦娃自动预约-公众号代挂

效果 #小程序://航旅黔购/1nkYlNRVzm0Gg9x #小程序://贵旅优品/7zz6mtnSVgDfyqa #小程序://新联惠购/ibFdsuhWqIbczEd #小程序://贵盐黔品/u2TgExCUdkavrFe #小程序://空港乐购/ANkOOdqEeo71kah #小程序://遵航出山/ZkR7DQy1raoPxKD #小程序://乐旅商城/Ip5cgpJ7TLmRrWF #小程序…...

ESP32应用教程(0)— PMW3901MB光流传感器

文章目录 前言 1 传感器介绍 1.1 关键特征 1.2 关键参数 2 硬件概述 2.1 信号引脚 2.2 参考电路图 3 寄存器 3.1 寄存器列表 3.2 性能优化寄存器 4 代码说明 4.1 结构体说明 4.2 编译说明 5 波形分析 前言 本文介绍了在 ESP32 DEVKIT V1 开发板上开发 PMW3901MB…...

docker部署nginx,部署springboot项目,并实现访问

一、先部署springboot项目 1、安装docker&#xff1a; yum install docker -y 2、启动docker&#xff1a; service docker start 重启&#xff1a; service docker restart 3、查看版本&#xff1a; docker -v 4、使设置docker.service生效&#xff08;路径&#xff1a;…...

十五、模板方法模式

一、什么是模板方法模式 模板方法&#xff08;Template Method&#xff09;模式的定义如下&#xff1a;定义一个操作中的算法骨架&#xff0c;而将算法的一些步骤延迟到子类中&#xff0c;使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。 模板方法模式包含以…...

jvm 什么是常量池,常量池定义 class常量池

首先需要理解下Java的class文件&#xff0c;以及class文件结构&#xff1a; 1.Class文件是一组以8个字节为基础单位的二进制流&#xff0c;各个数据项目严格按照顺序紧凑地排列在文 件之中&#xff0c;中间没有任何分隔符&#xff0c;这使得整个Class文件中存储的内容几乎全部…...

CA证书颁发机构服务器

目录 一、CA证书颁发机构是什么&#xff1f; 二、数字证书可以干什么&#xff1f; 三、PKI&#xff1a;即公钥加密体系&#xff08;public key cryptography&#xff09; 四、CA在网络中的工作流程及原理&#xff08;以网站为例&#xff09; 五、HTTPS 的工作原理 六、CA私有证…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...