当前位置: 首页 > 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私有证…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...