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

使用GDI对象绘制UI时需要注意的若干细节问题总结

目录

1、一个bitmap不能同时被选进两个dc中

2、CreateCompatibleDC和CreateCompatibleBitmap要使用同一个dc作为参数

3、不能删除已经被选入DC中的GDI对象

4、使用完的GDI对象,要将之释放掉,否则会导致GDI对象泄漏

5、CreateCompatibleBitmap返回错误码8的原因及解决办法(用CreateDIBSection替换CreateCompatibleBitmap)

6、Windows开发人员必须要学会到微软MSDN上查看函数的详细说明

7、最后


C++软件异常排查从入门到精通系列教程(核心精品专栏,欢迎订阅,持续更新...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/125529931C/C++实战专栏(重点专栏,专栏文章已更新480多篇,持续更新中...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/140824370C++ 软件开发从入门到精通(专栏文章,持续更新中...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/category_12695902.htmlVC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/124272585C++软件分析工具从入门到精通案例集锦(专栏文章,持续更新中...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/131405795开源组件及数据库技术(专栏文章,持续更新中...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/category_2276111.html       我们在自绘窗口、给控件贴图、绘制文字时会使用到Pen画笔、Brush画刷、Bitmap位图、Font字体、Region区域、DC设备上下文等GDI对象,在使用这些GDI对象要注意一些细节问题,否则会出现一些绘制异常。本文结合多年的项目实践,给大家分享几个使用GDI对象的细节,以供大家借鉴或参考。

1、一个bitmap不能同时被选进两个dc中

       我们在使用Pen画笔、Brush画刷、Bitmap位图、Font字体、Region区域等GDI对象绘制之前,需要将它们选进DC设备上下文中,然后通过DC去操作使用。

       对于bitmap对象,使用示例如下:

// 先创建位图,然后将位图选进DC中,然后操作DC去完成绘图
HDC hMemDC = ::CreateCompatibleDC( hdc );
HBITMAP hMemBitmap = ::CreateCompatibleBitmap( hdc, rect.GetWidth(), rect.GetHeight() );
::SelectObject( hMemDC, hMemBitmap );

使用bitmap对象时,不能将一个bitmap同时选进两个dc中

       系统API函数SelectObject在MSDN上有明确的说明:

​即一个bitmap不能同时被选进两个dc。这个问题我们之前遇到过,因为新手在编写GDI绘制的代码时代码不规范,创建的GDI资源没有释放,导致一个bitmap被选进了两个dc中,导致绘制有问题,始终达不到预期的效果。

2、CreateCompatibleDC和CreateCompatibleBitmap要使用同一个dc作为参数

       我们在使用双缓冲绘图时会先创建一个内存DC和内存bitmap,如下:

// CreateCompatibleDC和CreateCompatibleBitmap使用的是同一个参数hdc
HDC hMemDC = ::CreateCompatibleDC( hdc );
HBITMAP hMemBitmap = ::CreateCompatibleBitmap( hdc, rect.GetWidth(), rect.GetHeight() );

但要注意,CreateCompatibleDC和CreateCompatibleBitmap两函数传入的dc对象必须是同一个

       有些人可能会将CreateCompatibleDC返回的dc对象,直接放到CreateCompatibleBitmap参数中,如下:

// 错误:CreateCompatibleBitmap使用CreateCompatibleDC返回的dc句柄
HDC hMemDC = ::CreateCompatibleDC( hdc );
HBITMAP hMemBitmap = ::CreateCompatibleBitmap( hMemDC, rect.GetWidth(), rect.GetHeight() );

这样会导致调用CreateCompatibleBitmap创建的位图是单色位图,只能绘制黑白颜色的效果。

       MSDN上CreateCompatibleBitmap API函数说明页面,有下面一段说明:

​大体意思是,当一个内存dc被创建时,初始拥有一个尺寸为1x1的单色的位图被选进去。如果这个新创建的内存dc(CreateCompatibleDC函数返回的dc),被用到CreateCompatibleBitmap的参数中用来创建bitmap,那么这个位图将是单色的位图,只能绘制黑白颜色的效果。

之前在开发截图功能时就遇到过,当时截图的背景始终是灰白色的,后来看到上述MSDN上说明才知道原因。


       在这里,给大家重点推荐一下我的几个热门畅销专栏,欢迎订阅:(博客主页还有其他专栏,可以去查看)

专栏1:该精品技术专栏的订阅量已达到570多个,专栏中包含大量项目实战分析案例,有很强的实战参考价值,广受好评!专栏文章持续更新中,预计更新到200篇以上!欢迎订阅!)

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

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

考察一个开发人员的水平,一是看其编码及设计能力,二是要看其软件调试能力!所以软件调试能力(排查软件异常的能力)很重要,必须重视起来!能解决一般人解决不了的问题,既能提升个人能力及价值,也能体现对团队及公司的贡献!

专栏中的文章都是通过项目实战总结出来的,包含大量项目问题实战分析案例,有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!

专栏2:(本专栏涵盖了C++多方面的内容,是当前重点打造的专栏,订阅量已达220多个,专栏文章已经更新到480多篇,持续更新中...)

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

以多年的开发实战为基础,总结并讲解一些的C/C++基础与项目实战进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域多个方面的内容,包括C++基础及编程要点(模版泛型编程、STL容器及算法函数的使用等)、数据结构与算法、C++11及以上新特性(不仅看开源代码会用到,日常编码中也会用到部分新特性,面试时也会涉及到)、常用C++开源库的介绍与使用、代码分享(调用系统API、使用开源库)、常用编程技术(动态库、多线程、多进程、数据库及网络编程等)、软件UI编程(Win32/duilib/QT/MFC)、C++软件调试技术(排查软件异常的手段与方法、分析C++软件异常的基础知识、常用软件分析工具使用、实战问题分析案例等)、设计模式、网络基础知识与网络问题分析进阶内容等。

专栏3:  

C++常用软件分析工具从入门到精通案例集锦汇总(专栏文章,持续更新中...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/131405795

常用的C++软件辅助分析工具有SPY++、PE工具、Dependency Walker、GDIView、Process Explorer、Process Monitor、API Monitor、Clumsy、Windbg、IDA Pro等,本专栏详细介绍如何使用这些工具去巧妙地分析和解决日常工作中遇到的问题,很有实战参考价值!

专栏4:   

VC++常用功能开发汇总(专栏文章,持续更新中...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/124272585

将10多年C++开发实践中常用的功能,以高质量的代码展现出来。这些常用的高质量规范代码,可以直接拿到项目中使用,能有效地解决软件开发过程中遇到的问题。

专栏5: 

C++ 软件开发从入门到精通(专栏文章,持续更新中...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/category_12695902.html

根据多年C++软件开发实践,详细地总结了C/C++软件开发相关技术实现细节,分享了大量的实战案例,很有实战参考价值。


3、不能删除已经被选入DC中的GDI对象

       DeleteObject API函数中,有如下的说明:

​即不能删除还在被选入dc中的GDI对象,需要选出后再删除,否则会导致绘制异常。

4、使用完的GDI对象,要将之释放掉,否则会导致GDI对象泄漏

       在GDI对象使用完成后要将之删除或释放掉,如果不删除或释放,则会导致GDI泄漏。如果有GDI对象泄漏的代码被频繁地执行,会导致GDI对象在持续的泄漏,当GDI对象总数接近或达到1万个时,就会导致GDI绘图函数调用出现异常,出现窗口绘制不出来等问题,紧接着程序就可能会出现崩溃。很多Windows老程序员可能都遇到过类似的问题。

       关于Windows进程的GDI对象数目上限的详细说明,可以查看我的文章:

从注册表看Windows系统进程GDI句柄及进程句柄数上限icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/139565038       创建GDI对象的接口比较多,要用对应的接口去释放,比如使用CreateXXXXXX创建的GDI对象,使用完后,要用DeleteObject释放;调用LoadXXXXXX函数去加载图片资源,使用完后,也要用DeleteObject释放;调用CreateXXXDC创建的DC对象,使用完后,要用DeleteDC去释放;调用GetDC获取到的DC对象,使用完后,要用ReleaseDC释放。

       调用不同的接口去创建或获取GDI对象,释放时也要调用对应的释放接口,不能混淆!在这里给大家大概地罗列一下:

创建或获取GDI对象删除或释放GDI对象
CreatePen/CreatePenIndirect(pen画笔对象)、CreateSolidBrush/CreateBrushIndirect(brush画刷对象)、CreateFont/CreateFontIndirect(Font字体对象)、CreateCompatibleBitmap(BItmap位图对象)对于Create出来的对象,要调用DeleteObject释放
CreateDC/CreateCompatibleDC(创建DC对象)调用DeleteDC释放
GetDC(获取DC对象)调用ReleaseDC释放
LoadBitmap(加载Bitmap位图)调用DeleteObject释放
LoadImage(加载图片资源)

如果加载的是Bitmap位图,则调用DeleteObject释放;

如果加载的是Cursor光标,则调用DestroyCursor释放;

如果加载的是Icon图标,则调用DestroyIcon释放。

      对于上面提到的创建GDI对象的API函数,在释放时该调用哪个接口,可以直接到MSDN上查看API接口的Remarks部分就会找到对应的说明。比如创建兼容位图的API函数CreateCompatibleBItmap,在Remaks部分的说明如下:

​再比如加载图片的API函数LoadImage,其在Remarks部分的说明如下:

在调用Windows系统API函数遇到问题时,需要到微软MSDN帮助页面中查看API函数的详细说明(可能会给出调用函数时的注意事项,或者调用函数的示例代码等),在说明中可能会找到相关的原因!会使用MSDN,是一个Windows开发人员最基本的要求!

       对于GDI对象泄漏问题的排查,首先到Windows任务管理器中看目标程序进程的GDI总数是否有异常(GDI总数特别大,好几千甚至接近10000个上限),然后再使用GDIView工具查看到底是哪一类GDI对象数量特别大

​基本可以确定该类对象有泄漏。然后去查看代码,检查每个操作该类GDI对象的地方,看看是否存在GDI对象使用完后没有释放。

使用GDIView工具查看具体是哪个GDI对象发生了泄漏。确定泄漏对象之后,需要去查看代码去排查GDI对象的泄漏点。但软件的模块多,代码量大,不好漫无目标地排查。可以尝试去找到复现问题的办法,根据复现问题的操作步骤和场景,猜测问题可能出在哪些代码块中,即缩小代码排查的范围。 

       关于如何使用GDIView去排查GDI对象以及项目问题排查实例,可以查看我之前写的文章:
深入探究 C++ 程序中的资源泄漏问题icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/133631728使用GDIView工具排查GDI对象泄漏问题(常用分析工具)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/125399896使用GDIView工具排查GDI对象泄漏导致C++程序UI界面绘制异常的问题icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/140731065使用GDIView工具排查GDI对象泄漏案例的若干细节总结icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/141526436

5、CreateCompatibleBitmap返回错误码8的原因及解决办法(用CreateDIBSection替换CreateCompatibleBitmap)

       之前我们在加载图片去绘制窗口时(比如将图片加载起来显示到窗口中),如果图片尺寸过大,会出现CreateCompatibleBitmap返回失败,即创建位图失败的问题。调用GetLastError获取调用CreateCompatibleBitmap失败的LastError值为8,查看该错误码的含义为:

​即创建位图时需要对应的内存,而内存资源不足,导致申请内存失败,所以CreateCompatibleBitmap调用失败了。创建位图的示例代码如下:

HDC hDC = ::GetDC( NULL );
HDC hMemDC = ::CreateCompatibleDC( hdc );
HBITMAP hMemBitmap = ::CreateCompatibleBitmap( hdc, nBmpWidth, nBmpHeight );

比如我们要加载的图片尺寸为3000*3000,则需要的内存大小为:

图片的宽高相乘,得到图片的像素个数,每个像素占4个字节(R、G、B、Alpha各占一个字节),则创建这样尺寸的位图需要的内存为:

3000*3000*4 = 34MB

34MB的内存很大。

       调用CreateCompatibleBitmap创建是DDB(Device​-dependent bitmap)设备相关位图,创建该位图使用的是系统内核的分页内存,这是稀有资源,可能会出现内存资源不够用的情况。可以使用API函数CreateDIBSection去创建DIB(Device​-independent bitmap)设备无关位图,这种方式下使用的是虚拟内存,基本就会出现内存不足的问题了。关于CreateCompatibleBitmap和CreateDIBSection的详细说明,可以查看我之前写的文章:
CreateCompatibleBitmap返回错误码8的原因及解决方案(使用CreateDIBSection替换CreateCompatibleBitmap)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/139586621

之前开发的截图功能,在部分机器上会频繁出现CreateCompatibleBitmap创建失败的问题,导致截图失败。后来就是用CreateDIBSection替换CreateCompatibleBitmap解决的。

      使用CreateDIBSection创建位图的示例代码如下

   BITMAPINFOHEADER bmih;memset(&bmih, 0, sizeof(BITMAPINFOHEADER));bmih.biSize = sizeof(BITMAPINFOHEADER);bmih.biBitCount = 24;bmih.biCompression = BI_RGB;bmih.biPlanes = 1;bmih.biWidth = nImageWidth; // 位图的宽度bmih.biHeight = nImageHeight; // 位图的高度BITMAPINFO bmi;memset(&bmi, 0, sizeof(BITMAPINFO));bmi.bmiHeader = bmih;void* p;hBitmap = ::CreateDIBSection(cdc.GetSafeHdc(), &bmi, DIB_RGB_COLORS, &p, NULL, 0);

6、Windows开发人员必须要学会到微软MSDN上查看函数的详细说明

       在调用Windows系统API函数遇到问题时,需要到微软MSDN帮助页面中查看API函数的详细说明。MSDN上可能会给出调用函数时的若干注意事项或限制条件(约束条件),或者给出调用API函数的示例代码可供参考,在函数说明中可能会找到引发问题的原因!会使用MSDN,是一个Windows开发人员基本要求!

       除了去查看MSDN上的说明,在使用工具时遇到问题,可以尝试到工具的官网上查找官方的说明,比如我们有次在使用GDIView时排查GDI对象泄漏时始终无法定位问题时,就是到GDIView工具的官网上找到了问题的答案,相关问题说明可以去查看我之前写的文章:

到GDIView等工具官网上或者微软MSDN上查看文档化说明去解决问题icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/126004453

7、最后

      使用GDI对象去编写绘图的代码相对简单,但在编码过程中要注意上面讲到的若干细节问题。

相关文章:

使用GDI对象绘制UI时需要注意的若干细节问题总结

目录 1、一个bitmap不能同时被选进两个dc中 2、CreateCompatibleDC和CreateCompatibleBitmap要使用同一个dc作为参数 3、不能删除已经被选入DC中的GDI对象 4、使用完的GDI对象,要将之释放掉,否则会导致GDI对象泄漏 5、CreateCompatibleBitmap返回错…...

C++:std::fstream详细介绍

std::fstream 是 C 标准库中的一个类,用于处理文件的输入输出操作。它可以同时进行文件的读和写操作,因此被称为“文件流”(File Stream)。它是 C 输入输出流库 iostream 的一部分,继承了 std::istream 和 std::ostrea…...

ndp协议简介

在IPv6中,ARP(地址解析协议)被替代为邻居发现协议(Neighbor Discovery Protocol,NDP)。NDP是IPv6网络中用于发现邻居节点(相邻设备)的协议,类似于IPv4中的ARP。但与ARP不…...

915DEBUG-obsidianTemplater使用

Templater使用 tp函数不正常显示相应数据 模板使用方式不正确 <% tp.date.now("YYYY-MM-DD") %> 应该被放置在一个被Templater识别为模板的文件中&#xff0c;或者在你使用Templater的插入模板功能时输入。如果只是在一个普通的Markdown文件中直接输入这段代码…...

【Linux篇】权限管理 - 用户与组权限详解

一. 什么是权限&#xff1f; 首先权限是限制人的。人 真实的人 身份角色 权限 角色 事物属性 二. 认识人–用户 Linux下的用户分为超级用户和普通用户 root :超级管理员&#xff0c;几乎不受权限的约束普通用户 :受权限的约束超级用户的命令提示符是#&#xff0c;普通用…...

JWT 在 SaaS 系统中的作用与分布式 SaaS 系统设计的最佳实践

在现代 SaaS&#xff08;软件即服务&#xff09; 系统中&#xff0c;随着服务规模的扩大和用户需求的多样化&#xff0c;如何高效、安全地进行用户身份验证、权限控制以及租户隔离&#xff0c;成为了系统架构中的核心问题之一。**JWT&#xff08;JSON Web Token&#xff09;**作…...

docker更换容器存储位置

一&#xff1a;原因 今天之前在某个服务器上使用docker搭建的服务突然无法访问了&#xff0c;进入服务器查看发现服务运行正常&#xff0c;但是就是无法使用&#xff0c;然后我这边准备将docker服务重新启动下看看&#xff0c;发现docker服务无法重启&#xff0c;提示内存已满…...

gitlab-cicd部署安装与具体操作

一、安装 本例中是用安装包直接在ubuntu下安装的&#xff0c;也可以用docker镜像。 curl -LJO https://gitlab-runner-downloads.s3.amazonaws.com/latest/rpm/gitlab-runner_amd64.rpmrpm -i gitlab-runner_amd64.rpm 安装runner后&#xff0c;需要跟在runner所在服务器安装…...

基于MFC实现的人机对战五子棋游戏

基于MFC实现的人机对战五子棋游戏 1、引言 此报告将详细介绍本次课程设计的动机、设计思路及编写技术的详细过程&#xff0c;展现我所学过的C知识以及我通过本次课程设计所学到例如MFC等知识。在文档最后我也会记录我所编写过程遇到的问题以及解决方案。 1.1 背景 五子棋是…...

mac电脑多个ssh keys共存

一、同一台电脑&#xff0c;不同域名的git仓库为什么要设置不同的ssh keys&#xff1f; 每个git仓库通常要求使用唯一的ssh key&#xff0c;以防止权限冲突和安全问题。 权限控制&#xff1a;每个git仓库的权限是独立的&#xff0c;使用不同的ssh keys可以更好的管理权限&…...

Elasticsearch数据迁移(快照)

1. 数据条件 一台原始es服务器&#xff08;192.168.xx.xx&#xff09;&#xff0c;数据迁移后的目标服务器&#xff08;10.2.xx.xx&#xff09;。 2台服务器所处环境&#xff1a; centos7操作系统&#xff0c; elasticsearch-7.3.0。 2. 为原始es服务器数据创建快照 修改elas…...

【Java-数据结构篇】Java 中栈和队列:构建程序逻辑的关键数据结构基石

我的个人主页 我的专栏&#xff1a;Java-数据结构&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 一、引言 1. 栈与队列在编程中的角色定位 栈和队列作为两种基本的数据结构&#xff0c;在众多编程场景中都有着独特的地位。它们为数据的有序…...

使用ensp搭建内外互通,使用路由跨不同vlan通信。

1.网络拓扑图 2.规则 &#xff08;1&#xff09;允许 &#xff08;自己&#xff09;ping通内外网&#xff0c;内外网随便一个pc就可以. &#xff08;2&#xff09; 允许&#xff08;电信&#xff09;ping通内外网&#xff0c;内外网随便一个pc就可以 &#xff08;时间问题不做…...

URDF 发布者

URDF 发布者 #! /usr/bin/env python3 import rclpy from rclpy.node import Node import rclpy.parameter from sensor_msgs.msg import JointState from rcl_interfaces.msg import SetParametersResultimport threading import timeclass RotateWheelNode(Node):def __init…...

用于目标检测的集中式特征金字塔

摘要 https://arxiv.org/pdf/2210.02093 视觉特征金字塔在多种应用中已展现出其在有效性和效率方面的优越性。然而,现有方法过度关注层间特征交互,却忽略了经验证明有益的层内特征调节。尽管一些方法试图借助注意力机制或视觉变换器来学习紧凑的层内特征表示,但它们忽略了…...

微信小程序购物车全选反选功能以及合计

微信小程序基于Vant Weapp的购物车功能实现 1、单选 使用微信小程序原生表单组件checkbox和checkbox-group 注意&#xff1a;checkbox原生不支持bind:change事件&#xff0c;checkbox-group支持 <checkbox-group bindchange"handleCheck"><checkbox val…...

大数据新视界 -- Hive 数据湖集成与数据治理(下)(26 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

【基础数学二】整除,最大公约数约数,最小公倍数

整除 在数论中&#xff0c;一个整数 a a a 能够被另一个整数 d d d 整除&#xff0c;记做 d ∣ a d|a d∣a。 整除的性质&#xff1a; 如果 d ∣ a d | a d∣a&#xff0c;则对于任意整数 k k k 有 d ∣ k a d | ka d∣ka。如果 d ∣ a d|a d∣a 并且 d ∣ b d|b d∣…...

【lua语言基础(四)】IO模型以及补充知识

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:lua从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多lua语言的知识   &#x1f51d;&#x1f51d; lua语言基础 1. 简单的IO模型2…...

Python知识分享第十九天-网络编程

网络编程 概述用来实现 网络互联 不同计算机上运行的程序间可以进行数据交互也叫Socket编程 套接字编程 三要素IP地址概述设备在网络中的唯一标识分类IPV4城域网13广域网22局域网31IPV6八字节 十六进制相关dos命令查看ipwindows: ipconfigmac和linux: ifconfig测试网络ping 域…...

【JuMP.jl】非线性规划

[JuMP] 03 非线性规划 非线性规划模型 非线性规划问题是线性规划问题的自然推广&#xff0c; 在实际的工程问题中&#xff0c;优化问题中的目标函数与约束不会总是线性函数&#xff0c;因此非线性规划的求解功能是必要的。 min ⁡ x ∈ R n f 0 ( x ) s.t. l j ≤ f j ( x ) ≤…...

网络(TCP)

目录 TCP socket API 详解 套接字有哪些类型&#xff1f;socket有哪些类型&#xff1f; 图解TCP四次握手断开连接 图解TCP数据报结构以及三次握手&#xff08;非常详细&#xff09; socket缓冲区以及阻塞模式详解 再谈UDP和TCP bind(): 我们的程序中对myaddr参数是这样…...

40分钟学 Go 语言高并发:服务性能调优实战

服务性能调优实战 一、性能优化实战概述 优化阶段主要内容关键指标重要程度瓶颈定位收集性能指标&#xff0c;确定瓶颈位置CPU、内存、延迟、吞吐量⭐⭐⭐⭐⭐代码优化优化算法、并发、内存使用代码执行时间、内存分配⭐⭐⭐⭐⭐系统调优调整系统参数、资源配置系统资源利用率…...

5092 星际争霸

逆序对排序&#xff1b; 字符串遍历&#xff1b; pair 特点&#xff1a; 两个值&#xff0c;第一个是字符串&#xff0c;第二个是逆序对数。而且没有重复的字符串。 #include<bits/stdc.h>using namespace std; typedef long long ll; const int N1e35; #define x f…...

AUTOSAR AP 汽车API知识点总结(Automotive API )R24-11

汽车API知识点总结 一、背景与目标 背景:智能互联汽车正逐步依赖远程诊断、软件更新等功能以确保行驶安全,并且用户已习惯于通过智能设备中的应用程序控制连接设备。虽然AUTOSAR标准支持车辆软件的可更新性,但尚未提供将AUTOSAR应用产生的数据和功能安全可靠地暴露给非AUTO…...

vue2:Cascader 级联选择器中加载两种不同的数据结构

前言 因UI调整,需要将el-tree控件更换为级联选择器,而在原树形控件中,加载了两种不同的数据结构,(参见vue2:树形控件el-tree中加载两种不同结构的数据_vue2 树形插件-CSDN博客)所以现在级联选择器中也需要加载这两种不同的数据结构。 问题 原本以为处理方式差不多,在…...

【xLSTM-Transformer序列分类】Pytorch使用xLSTM-Transformer对序列进行分类源代码

Python, Pytorch使用xLSTM-Transformer对序列进行分类源代码。xLSTM是不久前LSTM团队提出来的新模型&#xff0c;将xLSTM融入Transformer的Encoder中&#xff0c;创新型较强。另外&#xff0c;Transformer是完整的&#xff0c;即使用了Encoder、Decoder和Embedding所有模块。 …...

TDengine 签约安徽智质,助力海螺水泥智慧工厂升级

在当前制造业数字化转型的浪潮中&#xff0c;如何实现智能化、自动化与数据驱动的高效生产&#xff0c;成为企业提升竞争力的关键。尤其是在水泥、钢铁等传统行业&#xff0c;随着技术的不断进步&#xff0c;如何打破数据孤岛、提升生产管理效率&#xff0c;已经成为许多工厂亟…...

Hbase整合Mapreduce案例2 hbase数据下载至hdfs中——wordcount

目录 整合结构准备数据下载pom.xmlMain.javaReduce.javaMap.java操作 总结 整合结构 和案例1的结构差不多&#xff0c;Hbase移动到开头&#xff0c;后面跟随MR程序。 因此对于输入的K1 V1会进行一定的修改 准备 在HBASE中创建表&#xff0c;并写入数据 create "wunaii…...

WHLUG丨deepin、华中科技大学开放原子开源俱乐部、 RustSBI 和清华大学开源操作系统训练营共话开源新生代成长之路

2024年11月30日下午&#xff0c;由 deepin&#xff08;深度&#xff09;社区联合华中科技大学开放原子开源俱乐部、 RustSBI 开源社区和清华大学开源操作系统训练营共同举办的WHLUG&#xff08;武汉Linux用户组&#xff09;线下沙龙在华中科技大学成功举办。 本次活动聚集了50余…...

深入理解AVL树:结构、旋转及C++实现

1. AVL树的概念 什么是AVL树&#xff1f; AVL树是一种自平衡的二叉搜索树&#xff0c;其发明者是Adelson-Velsky和Landis&#xff0c;因此得名“AVL”。AVL树是首个自平衡二叉搜索树&#xff0c;通过对树的平衡因子进行控制&#xff0c;确保任何节点的左右子树高度差最多为1&…...

L15.【LeetCode笔记】相同的树

目录 1.题目 代码模板 2.分析 通过合理的if判断分类讨论两个根节点 1.首先,p和q都为NULL的情况最好排除 2.排除了两个都为NULL的情况,剩下的情况:1.其中一个为NULL;2.两个都不为NULL 写法1 写法2 3.只剩下最后一种情况:p和q都不为NULL 3.代码 提交结果 1.题目 https…...

【算法】【优选算法】位运算(下)

目录 一、&#xff1a;⾯试题 01.01.判定字符是否唯⼀1.1 位图1.2 hash思路1.3 暴力枚举 二、268.丢失的数字2.1 位运算&#xff0c;异或2.2 数学求和 三、371.两整数之和四、137.只出现⼀次的数字 II五、⾯试题 17.19.消失的两个数字 一、&#xff1a;⾯试题 01.01.判定字符是…...

网络——Socket与WebSocket

Socket与WebSocket都是网络通信中的重要概念&#xff0c;但它们在原理、应用场景及特性上存在显著的差异。以下是对两者的详细比较&#xff1a; 一、Socket 定义&#xff1a;Socket&#xff08;套接字&#xff09;是计算机网络中的一个抽象层&#xff0c;它允许应用程序通过网…...

Springboot3整合Redis

书接上篇《Redis 安装篇&#xff08;阿里云服务器&#xff09;_阿里云安装redis-CSDN博客》&#xff0c;安装好Redis后&#xff0c;就需要在springboot项目中使用Redis了。 一、SpringBoot整合Redis 1.添加坐标 <!--redis--> <dependency><groupId>org.sp…...

Java CountDownLatch 用法和源码解析

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

微信小程序3-显标记信息和弹框

感谢阅读&#xff0c;初学小白&#xff0c;有错指正。 一、实现功能&#xff1a; 在地图上添加标记点后&#xff0c;标记点是可以携带以下基础信息的&#xff0c;如标题、id、经纬度等。但是对于开发来说&#xff0c;这些信息还不足够&#xff0c;而且还要做到点击标记点时&a…...

Android 消息队列之MQTT的使用:物联网通讯,HTTP太重了,使用MQTT;断网重连、注册、订阅、发送数据和接受数据,实现双向通讯。

目录&#xff1a; 问题MQTT是什么以及为什么使用如何使用&#xff1a;第一阶段、基础功能如何使用&#xff1a;第二阶段、增加断网重连如何使用&#xff1a;第三阶段、封装 一、问题 在开发的时候&#xff0c;我们一般都使用Http和后台进行通讯&#xff0c;比如我们是开发物联…...

详解Java数据库编程之JDBC

目录 首先创建一个Java项目 在Maven中央仓库下载mysql connector的jar包 针对MySQL版本5 针对MySQL版本8 下载之后&#xff0c;在IDEA中创建的项目中建立一个lib目录&#xff0c;然后把刚刚下载好的jar包拷贝进去&#xff0c;然后右键刚刚添加的jar包&#xff0c;点击‘添…...

详解C++类与对象(四)

文章目录 1.类型转换1.1 前言1.2 类型转换的性质 2.static成员2.1 前言2.2 static的基本概念 3.友元4.内部类5.匿名对象 1.类型转换 1.1 前言 在C中&#xff0c;由于程序员可以自己显示定义一个新的类。这样就会出现一个问题&#xff1a;程序员自己显示定义的类类型与编译器中…...

使用 postman 传递 binary 类型的图片到后端接口遇到的坑

使用 psotman 传 binary 类型图片报错&#xff1a; -2024-12-04 [http-nio-9090-exec-1] WARN org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required r…...

第9章 大模型的有害性(上)

9.1 引言 本章将探讨大型语言模型&#xff08;LLMs&#xff09;可能带来的有害性&#xff0c;重点讨论以下几个方面&#xff1a; 性能差异社会偏见和刻板印象 在后续内容中&#xff0c;还会涉及其他层面的危害&#xff0c;如有害信息、虚假信息、隐私和安全风险、版权问题、…...

计算机视觉——相机标定(Camera Calibration)

文章目录 1. 简介2. 原理3. 相机模型3.1 四大坐标系3.2 坐标系间的转换关系3.2.1 世界坐标系到相机坐标系3.2.2 相机坐标系到图像坐标系3.2.3 像素坐标系转换为图像坐标系3.2.4 世界坐标转换为像素坐标 3.3 畸变3.3.1 畸变类型3.3.1.1 径向畸变&#xff08;Radial Distortion&a…...

Java爬虫技术全解析:从入门到精通

引言 在信息爆炸的今天&#xff0c;数据成为了最宝贵的资源之一。爬虫技术作为获取网络数据的重要手段&#xff0c;广泛应用于数据采集、信息聚合、市场分析等多个领域。Java作为一种强类型、面向对象的编程语言&#xff0c;以其稳健的性能和跨平台的特性&#xff0c;成为了开…...

leetcode hot100【Leetcode 416.分割等和子集】java实现

Leetcode 416.分割等和子集 题目描述 给定一个非负整数的数组 nums &#xff0c;你需要将该数组分割成两个子集&#xff0c;使得两个子集的元素和相等。如果可以分割&#xff0c;返回 true &#xff0c;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,…...

位段详解+代码展示

系列文章目录 &#x1f388; &#x1f388; 我的CSDN主页:OTWOL的主页&#xff0c;欢迎&#xff01;&#xff01;&#xff01;&#x1f44b;&#x1f3fc;&#x1f44b;&#x1f3fc; &#x1f389;&#x1f389;我的C语言初阶合集&#xff1a;C语言初阶合集&#xff0c;希望能…...

python实现c++中so库调用及dbus服务开发

本期介绍主要分两块,一块是python如何调用so库,另一块是dbus服务的注册与调用; python调用so库 1. c++源码 # test.h文件#include<iostream> using namespace std;extern "C"{ int cacl(int a, int b); struct student{char sname[50];int score;}; stud…...

如何进行GC调优

目录 1、GC是什么? 垃圾回收算法、收集器等 2、优化目标 3、优化策略 这个属于较为开放题目&#xff0c;可以结合自己项目实战出发&#xff0c;体现JVM调优。 1、GC是什么? 垃圾回收算法、收集器等 2、优化目标 (1) 将进入老年代的对象数量降到最低 (2) 减少FullGC的执行…...

JAVA |日常开发中读写TXT文本详解

JAVA &#xff5c;日常开发中读写TXT文本详解 前言一、读取 TXT 文本1.1 使用BufferedReader读取1.2 使用Scanner读取 二、写入 TXT 文本2.1 使用BufferedWriter写入2.2 使用PrintWriter写入2.3 字节流写入&#xff08;FileOutputStream&#xff09;后转换为字符流&#xff08;…...

开源模型应用落地-安全合规篇-用户输入价值观判断(三)

一、前言 在深度合规功能中,对用户输入内容的价值观判断具有重要意义。这一功能不仅仅是对信息合法性和合规性的简单审核,更是对信息背后隐含的伦理道德和社会责任的深刻洞察。通过对价值观的判断,系统能够识别可能引发不当影响或冲突的内容,从而为用户提供更安全、更和谐的…...