网络编程 初探windows编程
目录
一、什么是Winodws编程
二、开发环境搭建以及如何学习
三、VA助手安装
四、第一个Win32程序
五、窗口类句柄/窗口类对象
六、Winodws消息循环机制
七、Windows数据类型
一、什么是Winodws编程
Windows 编程指的是在 Microsoft Windows 操作系统上进行软件开发的过程,通常涉及使用 Windows API、.NET Framework、WPF(Windows Presentation Foundation)、WinForms 等技术。下面我将简要介绍一些相关的内容。
-
Windows API: Windows 应用程序接口(Windows API)是一组定义了 Windows 操作系统核心功能的函数和数据结构的集合。通过调用这些函数,开发者可以实现诸如窗口管理、文件操作、内存管理等底层操作。使用 Windows API 进行编程可以获得最高的灵活性和控制力,但也需要处理更多的细节。
-
.NET Framework: .NET Framework 是一个由微软开发的应用程序框架,它提供了大量的库和运行时环境,使开发者能够使用多种编程语言(如C#、VB.NET)来开发 Windows 应用程序。.NET Framework 包括了各种功能强大的类库,以及对于 Windows 应用程序开发非常有用的 Windows Forms 和 WPF 框架。
-
WPF(Windows Presentation Foundation): WPF 是用于创建 Windows 客户端应用程序的 UI 框架,它提供了一种基于 XML 的标记语言 XAML(Extensible Application Markup Language)来定义用户界面,同时支持丰富的数据绑定、样式模板、动画等功能。相较于传统的 Windows Forms,WPF 提供了更加灵活和强大的界面设计方式,可以实现更富有表现力的用户界面。
-
WinForms: Windows Forms 是 .NET Framework 中的一部分,提供了一种快速开发 Windows 应用程序的方式。开发者可以使用 Visual Studio 中的可视化设计器来创建界面,并通过添加事件处理程序等方式来实现应用程序逻辑。虽然 WinForms 在界面设计方面不如 WPF 灵活,但它仍然是许多传统的 Windows 应用程序的首选开发方式
.h 文件和 .cpp 文件通常用于 C++ 项目的代码组织。它们有不同的作用:
-
.h 文件(头文件):
- 通常包含类的声明、函数原型、常量定义以及其他需要在多个源文件中共享的信息。
- 头文件中通常不包含函数或类的实际实现,而是只包含其声明,以便其他源文件可以通过包含头文件来访问这些声明。
- 使用头文件可以帮助提高代码的模块化和可维护性,因为它们允许将代码分割成更小的单元并进行组织。
- 头文件通常使用 ".h" 扩展名,但也可能使用 ".hpp" 或其他类似的形式。
-
.cpp 文件(源文件):
- 包含了类成员函数和全局函数的实际实现,以及全局变量的定义等。
- 在 .cpp 文件中,你会找到与头文件中声明的内容对应的实际代码。
- .cpp 文件通常被编译器编译成目标代码,最终链接成可执行程序或库。
一般来说,C++ 项目中的代码都会以这种方式进行组织,头文件用于声明和共享信息,而 .cpp 文件用于实现声明并包含实际的代码逻辑。这种分离有助于提高代码的可读性、可维护性和重用性。
API:Application Programming Interface 应用程序编程接口。
SDK:Software Development Kit 软件开发工具包,一般会包括 API 接口文档,示例文档,帮助文档,使用手册,相关工具等。
二、开发环境搭建以及如何学习
Visual Studio Installer中选择
创建项目选择Windows桌面应用程序即可
如何学习?多查官方参考文档
Windows API官方文档:Windows API 索引 - Win32 apps | Microsoft Learn
三、VA助手安装
下载地址:https://www.jb51.net/softs/756854.html
解压密码:www.jb51.net
如果之前安装失败或者卸载过,参考下面文章解决
https://blog.csdn.net/m0_52776283/article/details/128329994
常用快捷键:只记住这几个就可以了,剩下的可以慢慢探索
- ALT+G:跳到定义
- ALT+SHIFT+F:查找所有引用
- ALT+左箭头/右箭头:回退/前进
四、第一个Win32程序
#include <windows.h>
#include <stdio.h>/*如何创建一个窗口:1. 设计窗口类2. 注册窗口类3. 创建窗口,操作系统会把它绘制出来4. 消息循环5. 回调函数
*/// LPCTSTR = CHAR* 指向多字节字符串的指针
LPCTSTR clsName = "My";
LPCTSTR msgName = "欢迎学习";// LRESULT = long
LRESULT CALLBACK MyWinProc(HWND hwnd, // handle to windowUINT uMsg, // message identifierWPARAM wParam, // first message parameter wordLPARAM lParam // second message parameter long
)
{//uMsg 消息类型int ret;/*声明 HDC hdc; 的目的是创建一个变量 hdc,用于存储设备上下文环境的句柄。通过使用设备上下文句柄,可以将绘图操作指定给特定的设备,如屏幕、打印机或图像文件等。在实际应用中,通常需要使用特定的函数来获取设备上下文句柄,例如 GetDC 函数用于获取屏幕设备上下文句柄。获取到设备上下文句柄后,可以使用它来进行相关的绘图操作,例如绘制线条、填充颜色、显示文本等。完成绘图操作后,可能需要使用相应的函数释放设备上下文句柄,以避免资源泄露。*/HDC hdc;switch (uMsg){case WM_CHAR:char szChar[20];sprintf_s(szChar, "您刚才按下了: %c", wParam);MessageBox(hwnd, szChar, "char", NULL);break;case WM_LBUTTONDOWN:MessageBox(hwnd, "检测鼠标左键按下", "msg", NULL);break;case WM_PAINT:// 声明了一个名为 ps 的 PAINTSTRUCT 结构体变量。PAINTSTRUCT 结构体用于存储绘图信息,包括绘图区域的坐标等。PAINTSTRUCT ps;// BeginPaint 函数用于开始绘图操作,并返回一个设备上下文句柄 hdc。// 它接受窗口句柄 hwnd 和指向 PAINTSTRUCT 结构体的指针作为参数。这个函数的调用表示程序即将开始在指定窗口进行绘图操作。hdc = BeginPaint(hwnd, &ps);TextOut(hdc, 0, 0, "www.baidu.com", strlen("www.baidu.com"));EndPaint(hwnd, &ps);// 用于结束绘图操作,并清理相关资源。MessageBox(hwnd, "重绘", "msg", NULL);break;case WM_CLOSE:ret = MessageBox(hwnd, "是否真的结束?", "msg", MB_YESNO);if (ret == IDYES){/*DestroyWindow(hwnd) 是一个 Windows API 函数,用于销毁指定窗口。在这里,hwnd 是一个窗口句柄,代表要销毁的窗口。通过调用 DestroyWindow(hwnd) 函数,程序可以关闭并销毁与该窗口相关联的资源。当调用 DestroyWindow 函数时,系统会发送 WM_DESTROY 消息给窗口过程函数,以通知窗口即将被销毁。窗口过程函数可以处理这个消息,并执行一些清理操作。之后,系统会释放与窗口相关的资源,包括设备上下文句柄、菜单、图标等。值得注意的是,使用 DestroyWindow 函数只能销毁由当前进程创建的窗口。如果要销毁其他进程创建的窗口,可以使用 PostMessage 函数发送 WM_CLOSE 消息给目标窗口。*/DestroyWindow(hwnd);}break;case WM_DESTROY:/*PostQuitMessage(0) 是一个 Windows API 函数,用于向消息队列中发送一个退出消息,通知应用程序要求其退出消息循环并终止。在这里,参数 0 表示指定的退出代码。当应用程序接收到这个退出消息后,它将会开始退出过程,并使用给定的退出代码作为程序的返回值。*/PostQuitMessage(0);break;default:// 默认过程函数处理其他消息return DefWindowProc(hwnd, uMsg, wParam, lParam);}return 0;
}// WINAPI = __stdcall
int WINAPI WinMain(_In_ HINSTANCE hInstance, // 标识当前程序实例的句柄 _In_opt_ HINSTANCE hPrevInstance,_In_ LPSTR lpCmdLine, _In_ int nShowCmd
) {// a 设计一个窗口类//定义和配置窗口对象WNDCLASS wndcls; // 用来存储窗口类信息的结构体实例。wndcls.cbClsExtra = NULL; // 表示窗口类的额外类内存,这里设为NULL表示不使用额外类内存。wndcls.cbWndExtra = NULL; // 表示每个窗口实例的额外窗口内存,这里同样设为NULL表示不使用额外窗口内存wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 指定了窗口背景的画刷句柄,这里使用 GetStockObject 函数获取了白色画刷。wndcls.hCursor = LoadCursor(NULL, IDC_ARROW); // 指定了光标的句柄,这里使用 LoadCursor 函数加载了箭头光标。wndcls.hIcon = LoadIcon(NULL, IDI_APPLICATION); // 指定了窗口的图标句柄,这里使用 LoadIcon 函数加载了应用程序图标。wndcls.hInstance = hInstance; // 指定了窗口类所属的实例句柄。程序的句柄wndcls.lpfnWndProc = MyWinProc; // 指定了窗口过程的地址,即窗口的消息处理函数。wndcls.lpszClassName = clsName; // 指定了窗口类的类名。wndcls.lpszMenuName = NULL; // 指定了窗口的菜单名,这里设置为NULL表示没有菜单。wndcls.style = CS_HREDRAW | CS_VREDRAW; // 指定了窗口类的风格,CS_HREDRAW | CS_VREDRAW 表示当窗口大小水平或垂直方向发生变化时,窗口的内容需要重绘。// b 注册窗口类// 窗口类的信息被注册到系统中,使得之后可以使用这个窗口类来创建窗口实例,以便让系统知道如何处理特定类型的窗口。RegisterClass(&wndcls);// c 创建窗口// 通过调用 CreateWindow 函数,根据指定的窗口类、标题和风格等信息,系统会创建一个窗口实例,并返回该窗口的句柄。// 句柄可以用于后续对窗口进行操作和管理。/*clsName: 窗口类名,这里使用之前注册的窗口类 clsName。msgName: 窗口标题,用于在窗口的标题栏显示窗口的名称。WS_OVERLAPPEDWINDOW: 窗口风格,指定了窗口的外观和行为,这里使用了 WS_OVERLAPPEDWINDOW 风格,表示创建一个具有标题栏、边框和最大化/最小化按钮的窗口。CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT: 窗口的初始位置和大小,这里使用 CW_USEDEFAULT 表示使用系统默认值,即由系统决定窗口的位置和大小。NULL: 父窗口句柄,这里设置为NULL表示新创建的窗口没有父窗口。hInstance: 窗口所属的实例句柄,用于标识窗口所属的应用程序。NULL: 与窗口相关联的菜单句柄,这里设置为NULL表示不使用菜单。*/HWND hwnd = CreateWindow(clsName, msgName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance,NULL);//d 显示和刷新窗口ShowWindow(hwnd, SW_SHOWNORMAL); // 用于显示先前创建的窗口实例,这里使用 SW_SHOWNORMAL 表示以原始大小和位置显示窗口。UpdateWindow(hwnd); // 用于更新先前创建的窗口实例的客户区域。这样做可以立即将窗口客户区域的内容显示出来。//e 消息循环 GetMessage 只有在接收到 WM_QUIT 才会返回 0//TranslateMessage 翻译消息 WM_KEYDOWN 和 WM_KEYUP 合并为 WM_CAHR// MSG是一个结构体MSG msg;/*当调用 GetMessage 函数时,系统会检查当前线程的消息队列,如果队列中有消息,则将消息复制到 msg 结构体中,并返回非零值;如果队列中没有消息,函数会将当前线程置于等待状态,直到有新消息到达为止。通常情况下,这行代码会被放在一个循环中,不断地调用 GetMessage 函数以获取并处理消息,直到接收到退出程序的消息为止。通过不断地获取消息,程序可以及时响应用户的输入、系统事件等各种消息,从而实现交互式的用户界面和响应式的应用程序逻辑。*/while (GetMessage(&msg, NULL, NULL, NULL)) // 3个NULL 表示没有过滤规则,即获得所有消息{/*调用了 TranslateMessage 函数,用于将虚拟键消息转换为字符消息。具体来说,该函数会检查接收到的消息是否属于虚拟键消息(如键盘按键事件),如果是,则将其转换为相应的字符消息(如字符输入事件)。这样可以确保程序正确处理用户的键盘输入。*/TranslateMessage(&msg);/*调用了 DispatchMessage 函数,用于将消息分派给窗口过程(Window Procedure)来进行处理。每个窗口都有一个窗口过程,它是对窗口消息进行处理的函数。DispatchMessage 函数会根据消息中的窗口句柄找到对应的窗口过程,并将消息传递给该窗口过程进行处理。*/DispatchMessage(&msg);}return msg.wParam;
}
五、窗口类句柄/窗口类对象
窗口就是屏幕上的一片区域,接收用户的输入,显示程序的输出。可以包含标题栏,菜单栏,工具栏,控件等。
句柄[Handle]:(资源的编号,二级指针,门把手),窗口句柄,文件句柄,数据库连接句柄。
C++窗口类对象与窗口并不是一回事,它们之间惟一的关系是C++窗口类对象内部定义了一个窗口句柄变量,保存了与这个 C++窗口类对象相关的那个窗口的句柄。窗口销毁时,与之对应的 C++窗口类对象销毁与否,要看其生命周期是否结束。但 C++窗口类对象销毁时,与之相关的窗口也将销毁。
WinMain函数的第一个参数,HINSTANCE hInstance 是一个表示程序实例的句柄(handle)。在Windows操作系统中,每个正在运行的程序都有一个唯一的实例句柄,用于标识该程序在内存中的位置和资源。hInstance 参数在程序启动时由操作系统传递给程序的主函数 WinMain(),以便程序可以使用该句柄来访问程序实例的各种资源,如窗口、图标、菜单等。
通过使用 hInstance 句柄,程序可以获取程序的路径、图标资源、对话框模板等信息,或者创建和管理窗口、菜单、图标等对象。另外,在多个实例同时运行的情况下,hInstance 句柄还可用于区分不同的程序实例。需要注意的是,hInstance 是一个抽象的句柄值,它不直接表示实际的内存地址。在操作系统中,句柄通常被映射到实际的内存地址或资源描述符上,程序可以通过句柄来间接引用这些内存地址或资源。
六、Winodws消息循环机制
事件可分为几种,由输入设备触发的,比如鼠标键盘等等。由窗体控件触发的,比如button控件,file菜单等。还有就是来自Windows内部的事件。这三种称为事件。
消息,是由事件翻译而来的。事件产生消息。从数据结构角度来讲,消息是一种结构体。结构如下:
typedef struct tagMSG{HWND hwnd; //窗口句柄。UINT message;//消息类型。WPARAM wParam;//32位附加信息。LPARAM lParam;//32位附加信息。DWORD time;//消息发送时间。POINT pt;//消息发送时,鼠标所在位置。}MSG;
消息队列:消息队列有两种,分为系统消息队列和应用程序消息队列。产生的消息首先由Windows系统捕获,放在系统消息队列,再拷贝到对应的应用程序消息队列。32/64位系统为每一个应用程序维护一个消息队列。
消息循环:系统为每个应用程序维护一个消息循环,消息循环会不断检索自身的消息队列。每有一个消息,就用GetMessage()取出消息。
while(GetMessage (&msg, NULL, 0, 0))//Windows消息循环。{TranslateMessage (&msg) ;//翻译消息,如按键消息,翻译为WM_CHARDispatchMessage (&msg) ;//分发消息到对应窗口}
GetMessage具有阻塞机制。当消息队列中没有消息时,程序非忙等,而是让权等待。当收到WM_QUIT时,GetMessage返回false,循环停止,同时应用程序终止。
消息处理:DispatchMessage()把取出来的消息分配给相应的窗口或线程,由窗口过程处理函数DefWindowProc()处理。
Windows的应用程序靠消息驱动来实现功能。而消息驱动靠消息机制来处理。消息机制就是由消息队列,消息循环,消息处理构成的。
那么,消息机制是如何运作的呢?
当用户运行一个应用程序,通过对鼠标的点击或键盘按键,产生一些特定事件。由于Windows一直监控着I/O设备,该事件首先会被翻译成消息,由系统捕获,存放于系统消息队列。经分析,Windows知道该消息应由那个应用程序处理,则拷贝到相应的应用程序消息队列。由于消息循环不断检索自身的消息队列,当发现应用程序消息队列里有消息,就用GetMessage()取出消息,封装成Msg()结构。如果该消息是由键盘按键产生的,用TranslateMessage()翻译为WM_CHAR消息,否则,用DisPatchMessage()将取出的消息分发到相应的应用程序窗口,交由窗口处理程序处理。Windows为每个窗体预留了过程窗口函数,该函数是一个回掉函数,由系统调用,应用程序不能调用。程序员可以通过重载该函数处理我们”感兴趣”的消息。对于不感兴趣的消息,则由系统默认的窗口过程处理程序做出处理。
上面代码的执行过程为:
- 消息循环调用GetMessage()从消息队列中查找消息进行处理,如果消息队列为空,程序将停止执行并等待(程序阻塞)。
- 事件发生时导致一个消息加入到消息队列(例如系统注册了一个鼠标点击事件),GetMessage()将返回一个正值,这表明有消息需要被处理,并且消息已经填充到传入的MSG参数中;当传入WM_QUIT消息时返回0;如果返回值为负表明发生了错误。
- 取出消息(在Msg变量中)并将其传递给TranslateMessage()函数,这个函数做一些额外的处理:将虚拟键值信息转换为字符信息。这一步实际上是可选的,但有些地方需要用到这一步。
- 上面的步骤执行完后,将消息传递给DispatchMessage()函数。DispatchMessage()函数将消息分发到消息的目标窗口,并且查找目标窗口过程函数,给窗口过程函数传递窗口句柄、消息、wParam、lParam等参数然后调用该函数。
- 窗口过程函数中,检查消息和其他参数,你可以用它来实现你想要的操作。如果不想处理某些特殊的消息,你应该总是调用DefWindowProc()函数,系统将按按默认的方式处理这些消息(通常认为是不做任何操作)
- 一旦一个消息处理完成,窗口过程函数返回,DispatchMessage()函数返回,继续循环处理下一个消息。
七、Windows数据类型
Unicode 是世界通用的字符编码标准,使用 16 位数据表示一个字符,一共可以表示 65535 种字符。 ASNI 字符集,使用 8 位数据或将相邻的两个 8 位的数据组合在一起表示特殊的语言字符。如果一个字节是负数,则将其后续的一个字节组合在一起表示一个字符。这种编码方式的字符集也称作“多字节”字符集。
DWORD 32 字节无符号整型数据 DWORD32 32 字节无符号整型数据DWORD64 64 字节无符号整型数据HANDLE 对象的句柄,最基本的句柄类型HICON 图标的句柄HINSTANCE 程序实例的句柄HKEY 注册表键的句柄HMODULE 模块的句柄HWND 窗口的句柄INT 32位符号整型数据类型INT_PTR 指向 INT 类型数据的指针类型INT32 32位符号整型INT64 64 位符号整型LONG32 32 位符号整型LONG64 64 位符号整型LPARAM 消息的 L 参数WPARAM 消息的 W 参数LPCSTR Windows,ANSI,字符串常量LPCTSTR 根据环境配置,如果定义了 UNICODE 宏,则是LPCWSTR类型,否则是 LPCSTR 类型
LPCWSTR UNICODE 字符串常量LPDWORD 指向 DWORD 类型数据的指针LPSTR Window,ANSI,字符串变量LPTSTR 根据环境配置,如果定义了 UNICODE,则是LPWSTR类型,否则是 LPSTR 类型LPWSTR UNICODE 字符串变量SIZE_T 表示内存大小,以字节为单位,其最大值是CPU 最大寻址范围TCHAR 如果定义了 UNICODE,则为 WCHAR,否则为CHARWCHAR 16 位 Unicode 字符
变量命名规则:
相关文章:

网络编程 初探windows编程
目录 一、什么是Winodws编程 二、开发环境搭建以及如何学习 三、VA助手安装 四、第一个Win32程序 五、窗口类句柄/窗口类对象 六、Winodws消息循环机制 七、Windows数据类型 一、什么是Winodws编程 Windows 编程指的是在 Microsoft Windows 操作系统上进行软件开发的过…...

Vue3 ref函数和reactive函数
一、ref函数 我们在setup函数中导出的属性和方法虽然能够在模板上展示出来,但是并没有给属性添加响应式,因此,我们需要使用ref函数来为我们的数据提供响应式。 (一)引入ref函数 import { ref } from "vue"…...
docker常用命令详解
1. Image常见操作 (1)查看本地image列表 docker images docker image ls (2)获取远端镜像 docker pull (3)删除镜像[注意此镜像如果正在使用,或者有关联的镜像,则需要先处理完] docker image rm imageid docker rmi -f imageid docker rmi -f $(docker …...

采集Prestashop独立站采集Prestashop独立站
import java.net.URL 这一行导入了Java.net包中的URL类,这个类在处理URL链接时非常有用。 import org.jsoup.Jsoup 这一行导入了Jsoup库,它是一个强大的HTML和XML文档解析库,我们可以使用它来解析网页内容。 import org.jsoup.nodes.Docume…...

2023.11-9 hive数据仓库,概念,架构,元数据管理模式
目录 0.数据仓库和数据库 数据仓库和数据库的区别 数据仓库基础三层架构 一.HDFS、HBase、Hive的区别 二.大数据相关软件 三. Hive 的优缺点 1)优点 2)缺点 四. Hive 和数据库比较 1)查询语言 2)数据更新 3)…...

MFC 简单绘图与文本编辑
目录 一.创建单文档项目 二.消息映射机制 三.WM_PAINT消息触发 四.CVIEW类 五.设备上下文 六.资源类和资源的关系 七.画线,矩形 八.画布 九.画笔 十.画刷 十一.利用TRACE打印日志 十二.文本编程 十三.ID号 十四.菜单栏 十五.菜单命令路由 十六.工具…...
C# 中的 SerialPort
简介 C# 中的 SerialPort 类提供了对串行端口(如 COM 端口)进行通信的功能。通过 SerialPort 类,你可以打开、关闭端口,读取和写入数据以及设置通信参数等。下面是对 SerialPort 类的一些详细解释: 创建 SerialPort 对…...

2022年06月 Python(五级)真题解析#中国电子学会#全国青少年软件编程等级考试
Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 Python中 print(“八进制{: o}”.format(12)) 正确的输出结果是?( ) A: 八进制:O B: 八进制:O14 C: 八进制14O D: 八进制14 答案:D 字符串的format()格式。 第2题 下列的程…...
YOLO图像识别
YOLO(you only look once),指只需要浏览一次就可以识别出图中的物体的类别和位置。 也因为只需要看一次,YOLO被称为Region-free方法,相比于Region-based方法,YOLO不需要提前找到可能存在目标的Region。 与…...

2023NewStarCTF
目录 一、阳光开朗大男孩 二、大怨种 三、2-分析 四、键盘侠 五、滴滴滴 六、Include? 七、medium_sql 八、POP Gadget 九、OtenkiGirl 一、阳光开朗大男孩 1.题目给出了secret.txt和flag.txt两个文件,secret.txt内容如下: 法治自由公正爱国…...
计算机网络的发展及应用
计算机网络是计算机技术和通信技术高度发展并相互结合的产物。一方面,通信系统为计算机之间的数据传送提供最重要的支持;另一方面,由于计算机技术渗透到了通信领域,极大地提高了通信网络的性能。计算机网络的诞生和发展࿰…...

K-means(K-均值)算法
K-means(k-均值,也记为kmeans)是聚类算法中的一种,由于其原理简单,可解释强,实现方便,收敛速度快,在数据挖掘、聚类分析、数据聚类、模式识别、金融风控、数据科学、智能营销和数据运…...
网络安全自学
前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防…...

加速mvn下载seatunnel相关jar包
seatunnel安装的时候,居然要使用mvnw来下载jar包,而且是从https://repo.maven.apache.org 下载,速度及其缓慢,改用自己本地的mvn下载。 修改其安装插件相关脚本,复制install-plugin.sh重命名为install-plugin-mvn.sh …...
【函数讲解】botorch中的函数 is_non_dominated():用于计算非支配(non-dominated)前沿
# 获取训练目标值,计算Pareto前沿(非支配解集合),然后从样本中提取出Pareto最优解。train_obj self.samples[1]pareto_mask is_non_dominated(train_obj)pareto_y train_obj[pareto_mask] 源码 这里用到了一个函数 is_non_dom…...

LeetCode题94,44,145,二叉树的前中后序遍历,非递归
注意:解题都要用到栈 一、前序遍历 题目要求 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3]示例 2: 输入:root [] 输出:[…...

Python 框架学习 Django篇 (九) 产品发布、服务部署
我们前面编写的所有代码都是在windows上面运行的,因为我们还处于开发阶段 当我们完成具体任务开发后,就需要把我们开发的网站服务发布给真正的用户 通常来说我们会选择一台公有云服务器比如阿里云ecs,现在的web服务通常都是基于liunx操作系统…...
Git 服务器上的 LFS 下载
以llama为例: https://huggingface.co/meta-llama/Llama-2-7b-hf Github # 1. 安装完成后,首先先初始化;如果有反馈,一般表示初始化成功 git lfs install # 2. 如果刚刚下载的那个项目没啥更改,重新下一遍&#x…...
Canvas和SVG:你应该选择哪一个?
如果你是一个Web开发者,你可能已经听说过Canvas和SVG。这两种技术都可以用来创建图形和动画,但它们有什么区别?在这篇文章中,我们将探讨Canvas和SVG的区别以及它们的应用场景,帮助你决定哪种技术更适合你的项目。 什么…...

openGauss学习笔记-122 openGauss 数据库管理-设置密态等值查询-密态支持函数/存储过程
文章目录 openGauss学习笔记-122 openGauss 数据库管理-设置密态等值查询-密态支持函数/存储过程122.1 创建并执行涉及加密列的函数/存储过程 openGauss学习笔记-122 openGauss 数据库管理-设置密态等值查询-密态支持函数/存储过程 密态支持函数/存储过程当前版本只支持sql和P…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...