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;
}

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

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

相关文章

Docker(三) 创建Docker镜像

一、在Docker中拉取最基本的Ubuntu系统镜像 搜索Ubuntu镜像 Explore Dockers Container Image Repository | Docker Hub 下载镜像 docker pull ubuntu:22.04 二、在镜像中添加自己的内容 使用ubuntu镜像创建容器 docker run -it ubuntu:20.04 /bin/bash 在容器中创建了一个文…

【高性能计算】opencl语法及相关概念(二):索引,队列,核函数

目录 数据并行及任务并行异构编程语言的共性opencl的划分方式opencl上下文定义以字符串为主的程序对象同一设备&#xff0c;多个命令队列同时执行多个核函数的示例 数据并行及任务并行 数据并行是将大规模的计算任务划分为多个子任务&#xff0c;并将这些子任务同时应用于不同…

Android AGP版本

做个记录&#xff1a; Android AGP版本 https://developer.android.com/studio/releases/gradle-plugin?hlzh-cn

Android动态可编辑长度列表

概述 在界面实现一个列表&#xff0c;用户可以随意给列表新增或者删除项目&#xff0c;在开发中比较常用&#xff0c;但是真正做起来又有点花时间&#xff0c;今天花时间做一个&#xff0c;以便在以后的开发中用到。 详细 运行效果&#xff1a; 二、实现思路&#xff1a; 1…

官方推荐使用的OkHttp4网络请求库全面解析(Android篇)

作者&#xff1a;cofbro 前言 现在谈起网络请求&#xff0c;大家肯定下意识想到的就是 okhttp 或者 retrofit 这样的三方请求库。诚然&#xff0c;现在有越来越多的三方库帮助着我们快速开发&#xff0c;但是对于现在的程序员来说&#xff0c;我们不仅要学会如何去用&#xff…

MMSegmentation训练自己的语义分割数据集

全流程&#xff0c;训练语义分割数据集 数据标注json转mask 运行源码MMSegmentation模型选择运行部分 数据标注 # 安装 pip install labelme # 启动labelme labelme然后 ctrl N 开启多边形标注即可&#xff0c;命名类为person 之后会保存到同目录下json文件&#xff1a; js…

【YOLOV5】YOLOV5添加SPPCSPC

当前YOLOV5版本为7.0 第一步 在models/common.py添加SPPCSPC class SPPCSPC(nn.Module):# CSP https://github.com/WongKinYiu/CrossStagePartialNetworksdef __init__(self, c1, c2, n1, shortcutFalse, g1, e0.5, k(5, 9, 13)):super(SPPCSPC, self).__init__()c_ int(2 *…

java.lang.classnotfoundexception: com.android.tools.lint.client.api.vendor

Unity Android studio打包报错修复 解决方式 java.lang.classnotfoundexception: com.android.tools.lint.client.api.vendor 解决方式 在 launcherTemplate 目录下找到 Android/lintOptions 选项 加上 checkReleaseBuilds false lintOptions { abortOnError false checkRelea…

Spring Bean 生命周期顺序验证

看到一篇写的很好的 Spring Bean 生命周期的博客&#xff1a;一文读懂 Spring Bean 的生命周期&#xff0c;在此写个简单的 Bean 进行验证。 1. 创建Springboot项目 基于 springboot 的2.1.8.RELEASE 创建一个简单项目&#xff0c;只添加 spring-aop 包以引入spring依赖。 &…

Redis下载和安装(Windows系统)

文章目录 创建Redis临时服务1) 启动服务端程序2) 启动客户端程序命令创建Redis服务3) 启动Redis客户端4) 检查是否连接成功 为便于大多数读者学习本套教程&#xff0c;教程中采用 Windows 系统对 Redis 数据库进行讲解。虽然 Redis 官方网站没有提供 Windows 版的安装包&#x…

进程间通信

一、进程间通信&#xff08;interprocess communication&#xff0c;简称 IPC&#xff09;指两个进程之间的通信。 系统中每个进程都有自己的地址空间&#xff0c;并且相互独立、隔离&#xff0c;每个进程都处于自己的地址空间中。 二、通信机制 Linux 内核提供了多种 IPC 机制…

无涯教程-Android - List View函数

Android ListView 是垂直滚动列表中显示的视图&#xff0c;使用 Adapter 从列表(如数组或数据库)中获取内容的列表项会自动插入列表中。 适配器(Adapter)实际上是UI组件和将数据填充到UI组件中的数据源之间的桥梁&#xff0c;适配器保存数据并将数据发送到适配器视图&#xff0…

WordPress(3)会员插件安装

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、服务器中上传插件二、使用步骤1.启动插件前言 提示:会员插件的安装不能在网站后台插件中心中直接安装原因我还没有排查 原因:会导致网站停止运行 一、服务器中上传插件 二、使用步骤 …

Python钢筋混凝土结构计算.pdf-混凝土强度设计值

计算原理&#xff1a; 需要注意的是&#xff0c;根据不同的规范和设计要求&#xff0c;上述公式可能会有所差异。因此&#xff0c;在进行混凝土强度设计值的计算时&#xff0c;请参考相应的规范和设计手册&#xff0c;以确保计算结果的准确性和合规性。 代码实现&#xff1a; …

el-select 使用

案例&#xff1a; /* * label : 界面上展示的是哪个字段,我这里需要展示名称 * value : 绑定的字段&#xff0c;一般是id */<el-selectv-model"Form.BillNumber"placeholder"请选择"change"changeValue($event)"><el-optionv-for"…

ThePASS研究院|以Safe为例,解码DAO国库管理

本研究文章由ThePASS团队呈现。ThePASS是一家开创性的DAO聚合器和搜索引擎&#xff0c;在为DAO提供洞察力和分析方面发挥着关键作用。 Intro 随着去中心化自治组织&#xff08;DAOs&#xff09;的发展&#xff0c;它们被赋予了越来越多的角色和期望。在这种巨幅增长的背景下&…

ToBeWritten之VSOC安全运营

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

论文阅读_医疗知识图谱_GraphCare

英文名称: GraphCare: Enhancing Healthcare Predictions with Open-World Personalized Knowledge Graphs 中文名称: GraphCare&#xff1a;通过开放世界的个性化知识图增强医疗保健预测 文章: http://arxiv.org/abs/2305.12788 代码: https://github.com/pat-jj/GraphCare 作…

Mac版JFormDesigner IDEA插件安装(非商业用途)

前言 仅供个人开发者使用&#xff0c;勿用作商业用途。 仅供个人开发者使用&#xff0c;勿用作商业用途。 仅供个人开发者使用&#xff0c;勿用作商业用途。 感觉做了这些年开发&#xff0c;怎么感觉市场越搞越回去了。桌面应用又成主流了&#xff1f; 甲方让做桌面客户端&am…

搭建个人备忘录中心服务memos、轻量级笔记服务

目录 一、源码 二、官网 三、搭建 四、使用 一、源码 GitHub - usememos/memos: A privacy-first, lightweight note-taking service. Easily capture and share your great thoughts. 二、官网 memos - Easily capture and share your great thoughts 三、搭建 docke…