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

商丘做网站一般多少钱/网络推广的具体方式

商丘做网站一般多少钱,网络推广的具体方式,在线拼接图片,临沂培训学校网站建设目录 1、WaitForSingleObject函数详细说明 2、在线程函数中调用WaitForSingleObject实现Sleep,可立即退出Sleep状态 3、调用WaitForSingleObject函数监测线程或进程是否已经退出 3.1、子进程实时监测主进程是否已经退出,主进程退出了,则子…

目录

1、WaitForSingleObject函数详细说明

2、在线程函数中调用WaitForSingleObject实现Sleep,可立即退出Sleep状态

3、调用WaitForSingleObject函数监测线程或进程是否已经退出

3.1、子进程实时监测主进程是否已经退出,主进程退出了,则子进程要自动退出

3.2、启动子进程后等待子进程执行完退出后,再执行后续操作


C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931C/C++基础与进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.htmlVC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585C++软件分析工具从入门到精通案例集锦(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795开源组件及数据库技术(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_2276111.html       在做多线程同步时,我们经常调用WaitForSingleObject接口去等待事件、互斥量和信号量等对象,获取这些对象的所有权。除了等待这些对象的作用外,还可以去等待线程和进程,今天就来结合日常的代码实践,详细地总结一下WaitForSingleObject函数的用途。

1、WaitForSingleObject函数详细说明

       WaitForSingleObject 函数检查指定对象的当前状态。 如果对象的状态未对齐,则调用线程将进入等待状态,直到发出对象信号或超时间隔已过。

DWORD WaitForSingleObject( [in] HANDLE hHandle, [in] DWORD  dwMilliseconds );

此函数的参数说明说下:

[in] hHandle
要等待的对象句柄。 WaitForSingleObject 函数可以等待以下对象:

  • 更改通知
  • 控制台输入
  • 可等待计时器
  • 内存资源通知
  • 事件(Event)
  • 互斥量(Mutex)
  • 信号量(Semaphore)
  • 线程(Thread)
  • 进程(Process)

句柄必须具有 SYNCHRONIZE 访问权限,SYNCHRONIZE的说明如下:

The right to use the object for synchronization. This enables a thread to wait until the object is in the signaled state.

[in] dwMilliseconds
超时间隔(以毫秒为单位)。 如果指定了非零值,则函数将等待,直到发出对象信号或间隔已过。 如果 dwMilliseconds 为零,则如果未向对象发出信号,则函数不会进入等待状态;它始终立即返回。 如果 dwMilliseconds 为 INFINITE,则函数仅在发出对象信号时返回。

关于WaitForSingleObject函数的说明,可以查看微软MSDN上的说明:

​​​​​​WaitForSingleObjecticon-default.png?t=N7T8https://learn.microsoft.com/zh-cn/windows/win32/api/synchapi/nf-synchapi-waitforsingleobject        WaitForSingleObject 函数可以等待以下对象:

  • 更改通知
  • 控制台输入
  • 可等待计时器
  • 内存资源通知
  • 事件(Event)
  • 互斥量(Mutex)
  • 信号量(Semaphore)
  • 线程
  • 进程

对于事件,分有信号和无信号两个状态,当事件对象编程有信号时,WaitForSingleObject立即返回。

       对于互斥量和信号量,调用WaitForSingleObject获取所有权,即WaitForSingleObject返回WAIT_OBJECT_0时获取他们的所有权,然后调用ReleaseMutex和ReleaseSemaphore释放对象的所有权。

       对于线程和进程,线程和进程创建时无信号,当线程和进程退出时对应的句柄就变成了有信号,这样WaitForSingleObject就返回了。可以通过WaitForSingleObject返回,判断线程或进程是否已经退出了:

WaitForSingleObject(hThread, INFINITE); // 参数INFINITE表示无限等待

        在这里,给大家重点推荐一下我的几个热门畅销专栏:

专栏1:(该专栏订阅量接近350个,有很强的实战参考价值,广受好评!专栏文章持续更新中,预计更新到200篇以上!)

C++软件调试与异常排查从入门到精通系列文章汇总icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931

本专栏根据近几年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的实战问题分析实例,带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!

专栏中的文章均是通过项目实战总结出来的(通过项目实战积累了大量的异常排查素材和案例),有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!

专栏2: 

C/C++基础与进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.html

以多年的开发实战为基础,总结并讲解一些的C/C++基础与进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域的多个方面的内容,同时给出C/C++及网络方面的常见笔试面试题,并详细讲述Visual Studio常用调试手段与技巧!

专栏3: 

开源组件及数据库技术icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12458859.html

以多年的开发实战为基础,分享一些开源组件及数据库技术! 


2、在线程函数中调用WaitForSingleObject实现Sleep,可立即退出Sleep状态

       一般在线程的线程函数中设置一个循环,在循环体中循环往复的执行相关的业务,但不能让循环体中的代码中不停歇地执行,否则线程会占用大量的CPU时间片,会导致程序的高CPU占用问题。

当程序出现高CPU占用问题时,基本都是程序中发生死循环了,所在线程一直在不停歇地执行,占用了大量的CPU时间片,所以导致线程占用了较高的CPU比例。

       所以,我们一般都要在线程函数的循环体中人为地添加一个Sleep,让线程时不时休息一下,不要那么忙碌。当线程进入Sleep状态时,线程就被挂起了,线程停止执行,系统不再给线程分配CPU时间片,当Sleep时间到了后,系统再唤醒线程,给线程分配CPU时间片,线程得以继续执行。

       实现线程Sleep有两种方式,一种是直接调用C函数Sleep睡眠,另一种借助事件对象去实现Sleep。使用事件实现有个好处是,能立即结束睡眠,退出Sleep状态。比如在终止线程执行时,能让Sleep立即停止,线程函数中的循环尽快结束,线程函数尽快退出。

       下面举一个使用事件对象实现Sleep的例子,我们在项目中多次使用了。先调用CreateEvent创建一个初始无信号,手动的事件对象:

// 创建一个手动的、初始无信号的事件对象
HANDLE hEvent = ::CreateEvent( NULL, TRUE, FALSE, NULL );

然后在创建线程时,将事件对象传到线程函数中:

// 创建一个线程去处理事务
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, (void *)hEvent, 0, NULL);
if (hThread != NULL)
{CloseHandle( hThread );
}

        在线程函数ThreadFunc中,获取到传入的事件对象参数,调用WaitForSingleObject函数实现Sleep(通过WaitForSingleObject等待超时实现Sleep):

unsigned _stdcall ThreadFunc(void *pParam)
{HANDLE hEvent = (HANDLE)pParam;BOOL bStart = TRUE;while (bStart){// ...  // 此处的业务代码省略// 在循环体中调用WaitForSingleObject实现Sleep的效果::WaitForSingleObject(hEvent, 500); // 通过等待超时,实现Sleep}return 1;
}

调用WaitForSingleObject进入等待状态时,会将线程挂起,这个Sleep的效果是一样的!

       最后在需要立即退出Sleep时,调用SetEvent函数将事件置为有信号,WaitForSingleObject立即返回。这样循环体就能尽快退出,线程函数能尽快退出,线程函数退出了,线程就结束了。

// 调用SetEvent将事件对象置为有信号,让WaitForSingleObject函数立即返回,尽快退出循环
::SetEvent(hEvent);

3、调用WaitForSingleObject函数监测线程或进程是否已经退出

       在主程序运行的过程中启动了一个子进程,有时主进程要等待子进程处理结果后根据返回的信息再控制后续代码的执行,有时子进程需要感知主进程是否已经退出,这两种情况都需要感知另一个进程是否已经退出。对于线程在某些场合下页存在类似的需求。

3.1、子进程实时监测主进程是否已经退出,主进程退出了,则子进程要自动退出

       主进程在运行过程中启动了一个子进程,启动子进程时将主进程的进程id传给子进程。子进程是依赖于主进程存活的,如果主进程退出或者崩溃了,则子进程就没有存在的意义了,要自动退出!所以子进程要实时监测主进程的状态,监测主进程有没有退出(包括崩溃闪退)。

       可能有人会说,主进程可以在退出时通知子进程,子进程收到通知后再自行退出。但主进程可能会发生崩溃或闪退,这种情况下一般时没法通知子进程的。

        那子进程如何才能实时监测主进程是否退出了呢?不管是主进程正常退出,还是异常崩溃闪退,都要感知到。子进程可以启动一个子线程,在子线程中通过主进程传过来的主进程id,获取主进程句柄,然后调用WaitForSingleObject等待主进程退出,可以在子线程中无限等待。如果主进程一旦退出,WaitForSingleObject函数就会立即返回,这时子进程就可以调用ExitProcess等接口自行退出当前子进程了。

       具体的代码实现是,子进程中启动一个子线程,将主进程传过来的主进程id传给该子线程,如下:(其中MonitorMainProcess是线程函数)

HANDLE hThread = (HANDLE)_beginthreadex( NULL, 0, MonitorMainProcess, (void*)dwMainProcessId, 0, NULL );
if ( hThread != NULL )
{CloseHandle( hThread );
}

线程函数MonitorMainProcess实现如下:

// 监控主工程
unsigned __stdcall MonitorMainProcess(void * pParam )
{DWORD dwProcessId = (DWORD)pParam;HANDLE hProcess = OpenProcess( SYNCHRONIZE, FALSE, dwProcessId );if(hProcess == NULL){ExitProcess(-1);}// 设置INFINITE无限等待WaitForSingleObject( hProcess, INFINITE );CloseHandle( hProcess );// WaitForSingleObject返回了,就表示主进程已经退出,直接退出本进程ExitProcess( -1 );
}

       进程初始是无信号的,进程退出时就变成了有信号,这样WaitForSingleObject等待到信号后,就返回了,这样子进程就直到主进程退出了。

       此处需要注意一下,调用OpenProcess时必须要设置SYNCHRONIZE参数,因为设置该标记参数后才能调用WaitForSingleObject去等待进程。微软MSDN上对SYNCHRONIZE如下:

SYNCHRONIZE:The right to use the object for synchronization. This enables a thread to wait until the object is in the signaled state.

       此外,监测主进程是否退出的代码是阻塞式的,不能放在主线程中的,这就是为什么要启动一个子线程去专门做这个监测任务的原因。

3.2、启动子进程后等待子进程执行完退出后,再执行后续操作

       有时我们需要启动一个子进程去完成某项操作,主进程在等待子进程的执行结果(需要获取子进程的执行数据), 然后主进程再去执行后续操作。主进程在启动子进程后,就可以调用WaitForSingleObject等待子进程退出,比如如下的代码:

// 启动一个子进程去执行一个操作任务
STARTUPINFO s  = {sizeof(s)}; 
PROCESS_INFORMATION   pi = {0};   
if( CreateProcess( NULL, cmdLine, NULL, NULL, TRUE, NULL, NULL, NULL, &s, &pi ) )
{   // 等待进程执行完毕   WaitForSingleObject( pi.hProcess, INFINITE );   // 关闭进程和主线程句柄CloseHandle( pi.hProcess );   CloseHandle( pi.hThread );   
}  // ...  // 去拿子进程的执行结果,去执行后续操作

       有时启动一个子线程,要等子线程执行完退出后,根据处理结果信息去继续执行,和上面等待进程退出是类似的。

相关文章:

WaitForSingleObject 函数的诸多用途与使用场景总结

目录 1、WaitForSingleObject函数详细说明 2、在线程函数中调用WaitForSingleObject实现Sleep,可立即退出Sleep状态 3、调用WaitForSingleObject函数监测线程或进程是否已经退出 3.1、子进程实时监测主进程是否已经退出,主进程退出了,则子…...

4、Redis高并发分布式锁实战

引言 在分布式系统中,保证数据的一致性和避免竞争条件是至关重要的。分布式锁是一种常用的机制,而Redis作为一款高性能的内存数据库,提供了简单而强大的分布式锁方案。本文将深入探讨如何利用Redis高并发分布式锁来解决分布式系统中的并发控…...

matlab subs 函数计算太慢

来源 计算机器人 transformation matrix 相关内容时,对于关节角度进行离散,循环计算很慢,随着角度划分越来越细,怎么提高速度是一个问题。 最优解决方法 fun_handle matlabFunction(T_t2b_RPY_tmp);T_t2b_RPY_tmp是 transform…...

如何确保网络传输的安全性和稳定性?

随着互联网的普及和数字化时代的到来,网络传输已经成为我们日常生活中不可或缺的一部分。无论是发送邮件、浏览网页、在线支付还是进行视频通话,都需要通过网络进行数据传输。然而,网络传输的安全性和稳定性问题也日益突出,如何确…...

鸿蒙应用开发学习:改进小鱼动画实现按键一直按下时控制小鱼移动和限制小鱼移出屏幕

一、前言 近期我在学习鸿蒙应用开发,跟着B站UP主黑马程序员的视频教程做了一个小鱼动画应用,UP主提供的小鱼动画源代码仅仅实现了移动组件的功能,还存在一些问题,如默认进入页面是竖屏而页面适合横屏显示;真机测试发现…...

紫光展锐5G扬帆出海 | Blade系列勇当拉美5G先锋

5G对拉丁美洲(简称“拉美”)绝大多数消费者来说还是一个新鲜技术。GSMA报告显示,过去五年,拉美运营商在移动网络方面的资本开支大部分用于部署4G网络。但在5G网络方面拉美也在积极大力投入中,紧跟全球5G发展大潮&#…...

如何设计一个高并发系统?

所谓高并发系统,是指能同时处理大量并发请求,并及时响应,从而保证系统的高性能和高可用 那么我们在设计一个高并发系统时,应该考虑哪些方面呢? 1. 搭建集群 如果你只部署一个应用,只部署一台服务器&…...

基于WebRTC技术的EasyRTC视频云服务系统在线视频客服解决方案

一、需求分析 随着互联网技术的发展,视频客服也成为服务行业的标配体验,基于WebRTC实时通信技术,客服人员与用户可以建立实时双向的视频交互与沟通。借助视频客服功能可以更加直观地了解用户的需求,提高沟通效率,并帮…...

黑马程序员——2022版软件测试——乞丐版——day04

目录: html介绍 前端三大核心html骨架标签注释标签 标题:h1~h6段落:p超链接a图片空格与换行布局标签列表input标签form标签作业 1.html介绍 前端三大核心 html:超文本标记语言,由一套标记标签组成标签: 单标签&…...

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -创建图文投票实现

锋哥原创的uniapp微信小程序投票系统实战: uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…...

Spring系列学习九、Spring MVC的使用

Spring MVC的使用 一、MVC设计模式概述二、Spring MVC的工作原理三、HandlerMapping和ViewResolver四、 处理表单、文件上传和异常处理五、前端页面(View)编写1. 引入Thymeleaf模板引擎2.页面相关的示例代码3.后端处理代码编写 六、总结 本章我们将与大家…...

开源内容管理系统Wagtail本地安装运行并结合内网穿透实现公网访问

文章目录 前言1. 安装并运行Wagtail1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具3. 实现Wagtail公网访问4. 固定的Wagtail公网地址 前言 Wagtail是一个用Python编写的开源CMS,建立在Django Web框架上。Wagtail 是一个基于 Django 的开源内容管理系统&#xf…...

【蓝桥杯/DFS】路径之谜 (Java)

路径之谜小明冒充X星球的骑士,进入了一个奇怪的城堡。 城堡里边什么都没有,只有方形石头铺成的地面。假设城堡地面是 n x n 个方格。【如图1.png】所示。按习俗,骑士要从西北角走到东南角。 可以横向或纵向移动,但不能斜着走&…...

Go语言的内存分配器

1. 内存分配器的历史 Go语言的第一个内存分配器是简单的伙伴分配器。伙伴分配器是一种经典的内存分配器,它将堆内存划分为多个大小相同的块,并使用一种递归的算法来分配和释放内存块。伙伴分配器简单高效,但它存在一个问题:当分配…...

Swift单元测试Quick+Nimble

文章目录 使用QuickNimble1、苹果官方测试框架XCTest的优缺点2、选择QuickNimble的原因:3、QuickNimble使用介绍集成:Quick关键字说明:Nimble中的匹配函数等值判断:使用equal函数是否是同一个对象:使用beIdenticalTo函…...

详解电源动态响应的测试方法及重要性 -纳米软件

电源动态响应测试的重要性 电源动态响应测试是为了检测电源系统在负载变化、输入电压变化情况下的性能表现,包括响应速度、稳定性以及恢复能力等,从而判断电源能否快速、准确地恢复到正常工作状态,为电源的优化设计提供依据。 动态响应能力影…...

计算机网络系统结构-2020期末考试解析

【前言】 不知道为什么计算机网络一门课这么多兄弟,这份看着也像我们的学科,所以也做了。 一. 单选题(每题 2 分,共 20 题,合计 40 分) 1 、当数据由主机 A 发送到主机 B ,不参…...

二叉树的遍历 Java

二叉树的遍历 递归法前序遍历中序遍历后序遍历改进 迭代法前序、后序遍历中序遍历 Java 中 null、NULL、nullptr 区别 public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode left, Tree…...

数据结构之str类

str类 str 是字符串类。str 大概是 Python 中除了int 之外最基本、最常用的数据类型,在Java与其他语言里基本叫做String,其用途广泛,随处可见,但是要记住一点,字符串是不允许修改的。不过,我们仍然可以对其…...

Java电影购票小程序在线选座订票电影

Java电影购票小程序 功能:注册用户可已查看电影场次评价选座订票退票,影院管理员可以排片退款在线卖票和管理演播室等。超级管理员可管理电影排片电影院用户管理等。 演示视频 小程序: https://www.bilibili.com/video/BV11W4y1A7mK/?shar…...

24-1-9 bilibilic++音视频

下午两点面试,面试官迟到了一会,面试官人很好,整体面试经历很不错,但是我人太紧张了,基础知识掌握的深度不够,没有深挖, 是做音视频的底层相关的, 实习要求只要每天打卡够九个小时就…...

备案(三)

首次备案需要多少天 备案初审:您提交初审后,天翼云会在一个工作日内进行审核,并通过短信和邮件形式通知审核结果。 管局审核:各地通管局审核时间不同,一般为1到20个工作日,审核结果将以短信和邮件形式通知…...

Hotspot源码解析-第十九章-ClassLoaderData、符号表、字符串表的初始化

第十九章-ClassLoaderData初始化 讲解本章先从一张图开始 众所周知,Java类的相关信息都是存储在元空间中的,但是是怎么存储的,相信很多读者是不清楚的,这里就不得不涉及到ClassLoaderDataGraph、classLoader、classLoaderData&…...

impala元数据自动刷新

一.操作步骤 进入CM界面 > Hive > 配置 > 搜索 启用数据库中的存储通知(英文界面搜索:Enable Stored Notifications in Database),并且勾选,注意一定要勾选,配置后面的配置不生效。数据库通知的保留时间默认为2天&#…...

骑砍战团MOD开发(35)-射击精度系统

一.射击精度 和CF等FPS射击类游戏一样,为了模拟实际射击过程中弓箭,子弹等投掷物的射击偏移,故设计精度系统控制不同武器不同兵种的使用武器能力,统称为游戏精度系统. 由于骑砍可以在马上进行射击,故引擎内部也内置了骑射技能点以便控制玩家在骑马过程中射击的能力. 武器精度:通…...

树莓派非常实用的程序-3 vcdbg

vcdbg 是一个应用程序,用于帮助从在ARM上运行的Linux调试VideoCore GPU。它需要以根用户身份运行。此应用程序主要用于Raspberry Pi工程师,尽管有一些命令一般用户可能会发现有用。 sudo vcdbg help 将给出可用命令的列表。 NOTE 仅列出了最终用户使用…...

jmeter分布式服务搭建

目录 一、环境准备 二、 安装包下载 三 、安装jdk 四 、控制机安装 4.1 解压压缩包 4.2 修改 bin/jmeter.properties 4.3 修改 bin/system.properties 五、执行机安装 5.1 解压安装包 5.2 修改 bin/jmeter.properties 5.3 修改 bin/system.properties 5.4 启动执行机 …...

vue中el-radio无法默认选中

页面上不生效&#xff0c;默认什么都不选中 <el-radio-group v-model"queryParams.videoUrlType"><el-radio :label"1">本地上传</el-radio><el-radio :label"2">外部链接</el-radio> </el-radio-group>da…...

分布式I/O应用于智慧停车场的方案介绍

客户案例背景 目前车位检测技术有磁电技术、超声波技术、红外线技术、图像识别车位技术。考虑到例如电磁干扰、信号干扰等的环境因素影响&#xff0c;通常会采用组合使用的方式进行&#xff0c;如采用不同的传感器、应用不同的协议等&#xff0c;以便提高车位检测的准确性和实时…...

node后端+vue前端实现接口请求时携带authorization验证

node后端vue前端实现接口请求时携带authorization验证 我们在写web项目时&#xff0c;后端写好接口&#xff0c;前端想要调用后端接口时&#xff0c;除了登录注册页面&#xff0c;所有的请求都需要携带authorization&#xff0c;这样是为了避免随意通过接口调取数据的现象发生…...