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

【第39节】windows编程:打造MFC版本任务管理器

目录

一、项目概述

二、项目开发的各种功能关键

2.1 进程信息的获取

2.2 线程信息的获取

2.3 进程模块信息的获取

2.3.1 模块快照

2.3.2 枚举模块

2.4 进程堆信息的获取

2.5 窗口信息的获取

2.6 文件信息的获取

2.7 内存信息和CPU占用率的获取

2.7.1 内存信息相关结构体

2.7.2 相关函数

2.7.3 使用例子

2.7.4 CPU占用率

三、其它功能要点

3.1 关机、重启,注销,休眠

3.2 老板键

 四、完整示例demo

4.1 完成的基础功能

4.2 界面说明

4.3 操作说明


一、项目概述

        在软件开发领域,构建一个带界面且功能丰富的项目往往充满挑战。本次项目不仅要应对多样化的数据展示需求,涵盖文件、进程、线程等多源信息,还需处理各类用户交互操作。接下来,让我们一同深入探索这个项目的关键要点,包括复杂数据的获取方法、界面展示的考量,以及如关机操作、老板键设置等特色功能的实现途径 ,为项目开发提供全面且清晰的指引,并提供实现demo。 

        本次开发基础除了MFC相关知识要求,还要熟悉windows sdk开发知识点,不会的请看前面的章节。下面简单介绍该项目要点,界面不在此讲述细节实现。

二、项目开发的各种功能关键

2.1 进程信息的获取

        在Windows系统里,要获取当前正在运行的进程,可以依靠快照系列API 。这套API挺厉害的,它不光能把正在运行的进程找出来,还能获取到进程的模块列表、堆这些信息。使用这套API有这么几个步骤:
(1)拍摄快照
(2)对快照进行遍历
(3)把快照关闭

下面就是创建进程快照,然后获取进程列表的具体做法:

//1.先创建一个进程快照
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 stcPe32;
//2.通过一组API遍历进程快照
Process32First(hProcessSnap, &stcPe32);
do {//3.使用从进程快照中提取出来的信息,信息已经提取到stcPe32变量中//这些信息包含进程的PID, 进程名等数据,这些数据可以显示到界面上//4.获取快照中下一个进程的信息
} while (Process32Next(hProcessSnap, &stcPe32));
//5关闭快照
CloseHandle(hSanp);

2.2 线程信息的获取

        获取线程信息的办法和获取进程信息差不多,也能用快照API来操作。但是,通过这个方法遍历得到的线程,是系统里所有的线程,并不是属于某一个特定进程的线程。这就可能出问题了,当我们要把这些线程数据显示到界面上的时候,就容易产生冲突。比如说,我们已经遍历出了进程列表,接下来想查看某个特定进程的线程列表,要是直接用刚才那种获取所有线程的方式,得到的线程就不是我们想要的。不过还好,遍历得到的线程信息里面,有一项是父进程的PID,利用这个PID进行筛选,就能找到指定进程的全部线程了。具体的操作方法如下:

//1.创建一个线程相关的快照句柄
hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
//2.循环遍历线程信息
//通过线程快照句柄获取第一个线程信息
Thread32First(hThreadSnap, &stcTe32))
do {//判断这个线程的父进程IDif (stcTe32.th320wnerProcessID == 指定进程的PID) {//将线程的信息显示到界面.}//获取快照中下一个线程信息
} while (Thread32Next(hThreadSnap, &stcTe32))

2.3 进程模块信息的获取

        模块信息也可以通过快照API来获取。每个进程都有自己特有的模块信息,当我们创建快照的时候,得指定一个进程的PID,这样创建快照的函数就能根据这个PID,把指定进程的模块列表给取出来。

        在获取模块信息的过程中,经常会碰到一个问题,那就是一般只能获取到32位进程的模块信息,对于64位进程的模块,就获取不了了。不过有个解决办法,就是用EnumProcessModulesEx函数,这个函数比较强大,32位和64位进程的模块它都能获取。但是要注意,使用这个函数有个前提,就是调用这个API的进程必须得是64位的。

        下面就分别讲讲这两种获取模块信息方法的具体使用:

2.3.1 模块快照

//1.创建模块快照
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPId);
//2.循环遍历快照中的模块信息
MODULEENTRY32 Module32;
Module32First(hModuleSnap, Module32);
do {//将获取到的信息显示到界面//4.获取快照中下一个模块信息
} while (Module32Next(hModuleSnap, &m_Module32));
CloseHandle(hSnap);

2.3.2 枚举模块

(想要同时遍历出32位和64位进程的模块,项目必须被编译成64位的)

HANDLE hProcess = NULL;
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwPID/*进程ID*/);
HMODULE hModules[0x2000] = {}; // 只用于获取模块句柄个数
DWORD dwNeed = 0; // 获取模块句柄个数
//枚举进程模块,函数会输出模块句柄数组
EnumProcessModulesEx(hProcess, hModules, sizeof(hModules), &dwNeed, LIST_MODULES_ALL);
DWORD dwModuleCount = dwNeed / sizeof(HMODULE);
MODULEINFO moif = {0}; //保存模块信息的结构体
//循环获取模块信息
for (SIZE_T i = 0; i < dwModuleCount; ++i) {//根据进程句柄和模块句柄获取模块路径GetModuleFileNameEx(hProcess, hModules[i], 缓冲区, 长度);//根据进程句柄和模块句柄获取模块其他信息GetModuleInformation(hProcess, hModules[i], &moif, sizeof(MODULEINFO))moif.EntryPoint; //dl1入口点moif.lpBaseOfD11; //dll基址moif.SizeOfImage; //dll大小//将获取到的模块信息显示到界面上.
}

2.4 进程堆信息的获取

一个进程堆的数量众多,但遍历方式同样可使用快照系列API。

//1.创建一个线程相关的快照句柄
hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SMAPTHREAD, O);
//2.循环遍历线程信息
do {//1)通过线程快照句柄获取第一个线程信息Thread32First(hThreadSnap, &stcTe32))//2)将信息显示到界面//3)获取快照中下一个线程信息
} while (Thread32Next(hThreadSnap, &stcTe32))

2.5 窗口信息的获取

        窗口信息说的就是当前系统里,正在显示的或者隐藏着的窗口的相关内容。在Windows系统里,EnumWindow函数专门用来把当前系统上所有窗口都列出来。这里的枚举,意思就是Windows会逐个查看所有窗口,在这个查看的过程中,它会调用一个回调函数,然后把查看到的窗口信息传送给这个回调函数。所以,要完成枚举窗口这件事,实际上包含两个部分:第一,调用EnumWinodw函数;第二,在回调函数里把枚举出来的窗口信息保存好。 

        下面就是枚举窗口函数用到的API原型: 

BOOL CALLBACK EnumWindowsProc(_In_    HWND hwnd, //遍历到的窗口句柄_In_    LPARAM 1Param  //EnumWindows函数传来的参数
);

枚举窗口的用法为:

BOOL CALLBACK EnumWinProc(HWND hWnd, LPARAM 1Param) { //回调函数//根据窗口句柄获取窗口名TCHAR buff[200];GetWindowText(hWnd, buff, 200); //得到窗口名,可显示到界面中.//判断窗口是否被隐藏if (IsWindowVisible(hWnd) == TRUE && wcslen(buff)!= 0)//窗口没有被隐藏且窗口标题长度不为0,则将窗口信息显示到界面中.
}
int main() {EnumWindow(&EnumWinProc/*枚举窗口的回调函数*/, NULL/*回调函数的附加参数*/);
}

2.6 文件信息的获取

        Windows系统提供了一组能用来遍历文件的API,分别是FindFirstFile和FindNextFile。FindFirstFile这个API的作用是找到一个文件夹里的第一个文件或者子文件夹。而FindNextFile呢,它负责一个接一个地去查找剩下的文件或文件夹,直到全部找完为止。所以,在使用这组API的时候,通常得先调用FindFirstFile,它会返回一个用来查找文件的句柄,拿到这个句柄后,再用FindNextFile去把剩下的文件都找出来。不过这组API有个局限性,它们只能找到当前目录下的文件和文件夹。要是想把所有层级文件夹里的文件都找出来,那就得自己写个递归函数才能做到了。

        下面给你看看这两个函数具体怎么简单使用:

HANDLE hFind ;
WIN32_FIND_DATA fData;
hFind = FindFirstFile(L"D:\\*", &fData);
if (hFind == (HANDLE)-1) return ;
do {//将遍历到的信息(fData结构体变量的内容)显示到界面.
} while (FindNextFile(hFind, &fData));

2.7 内存信息和CPU占用率的获取

2.7.1 内存信息相关结构体

typedef struct _MEMORYSTATUS {DWORD dwLength; //该结构体大小DWORD dwMemoryLoad; //当前系统内存的占用率(百分比)SIZE_T dwTotalPhys; //总的物理内存大小SIZE_T dwAvailPhys; //可能的物理内存大小以字节为单位SIZE_T dwTotalPageFile; //交换文件总大小SIZE_T dwAvailPageFile; //交换文件中空闲部分大小SIZE_T dwTotalVirtual; //总的虚拟内存大小SIZE_T dwAvailVirtual; //可用虚拟内存大小
}MEMORYSTATUS, *LPMEMORYSTATUS;

2.7.2 相关函数

获取系统内存信息

void WINAPI GlobalMemoryStatus(_Out_      LPMEMORYSTATUS lpBuffer //MEMORYSTATUS结构体指针
);

2.7.3 使用例子

//1.创建结构体对象并调用获取内存信息的函数
MEMORYSTATUS memStatus;
GlobalMemoryStatus(&memStatus);
//当前内存占用率:memStatus.dwMemoryLoad
//已用物理内存大小:memStatus.dwTotalPhys - memStatus.dwAvailPhys

2.7.4 CPU占用率

        CPU占用率,说的就是在单位时间里,CPU处于被占用状态的总时长。要算出这个数值,我们得先知道在一段时间内CPU实际被使用的时间,然后通过下面这个公式来计算它的占用率:

        使用率 = 100.0 - (空闲时间÷使用时间)× 100.0;

        至于获取当前CPU被占用的时间,就得借助GetSystemTimes函数了。这个函数可以获取到三个时间数据:CPU空闲下来的时间、CPU在内核态下被使用的时间,还有CPU在用户态下被使用的时间。这里面,把CPU在内核态和用户态被使用的时间加起来,得到的就是CPU总的使用时间。下面的代码展示了具体计算CPU占用率的方法:

double FILETIME2Double(const _FILETIME& fileTime) {return double(fileTime.dwHighDateTime * 4.294967296e9) + double(fileTime.dwLowDateTime);
}
Int GetCpuUsage(){// 空闲时间   内核时间    用户时间_FILETIME idleTime, kernelTime, userTime;//获取时间GetSystemTimes(&idleTime, &kernelTime, &userTime);//等待1000毫秒HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);//等待1000毫秒,使用内核对象等待会更精确WaitForSingleObject(hEvent, 1000);//获取新的时间_FILETIME newIdleTime, newKernelTime, newUserTime;GetSystemTimes(&newIdleTime, &newKernelTime, &newUserTime);//将各个时间转换double d01dIdleTime = FILETIME2Double(idleTime);double dNewIdleTime = FILETIME2Double(newIdleTime);double d0IdKernelTime = FILETIME2Double(kernelTime);double dNewKernelTime = FILETIME2Double(newKernelTime);double d01dUserTime = FILETIME2Double(userTime);double dNewUserTime = FILETIME2Double(newUserTime);//计算出使用率return int(100.0 - (dNewIdleTime - d0ldIdleTime) / (dNewKernelTime - d01dKernelTime + dNewUserTime - d0ldUserTime) * 100.0);
}

三、其它功能要点

3.1 关机、重启,注销,休眠

        关机、重启、注销以及休眠,这些操作都需要较高的权限才能执行。要是一个进程的权限不够高,去执行这些操作就会失败。所以,要是一个程序打算进行这些操作,第一步得用管理员权限来运行,第二步还得通过专门的权限提升函数,让程序获得关机的特权。具体的操作步骤是这样的: 

        (1)把关机特权获取到 

        (2)进行关机相关的操作 

        下面这段代码就是用来开启关机特权的 

HANDLE hToken = NULL;
HANDLE hProcess = GetCurrentProcess(); //该函数能得到该进程的伪句柄
OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
TOKEN_PRIVILEGES tp = {0 };
LookupPrivilegeValue(0, SE_SHUTDOWN_NAME, &tp.Privileges[0].Luid));
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
//调用函数提升权限
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);

下面的代码可用于关机等操作:
1. 关机:ExitWindowsEx(EWX_POWEROFF|EWX_FORCE);
2. 重启:ExitWindowsEx(EWX_REBOOT|EWX_FORCE);
3. 注销:ExitWindowsEx(EWX_LOGOFF|EWX_FORCE);
4. 休眠:SetSuspendState(TRUE,FALSE,FALSE);
5. 睡眠:SetSuspendState(FALSE,FALSE,FALSE);
6. 锁屏:LockWorkStation();

3.2 老板键

        老板键其实就是能快速响应全局按键,这样不用激活窗口,按一组特定按键,窗口就能迅速“消失”。 

        用这种加强版的快捷键分两步。第一步,用RegisterHotKey函数向系统注册一个全局热键,注册的时候能对热键进行设置,像热键的ID、快捷键之类的。函数原型如下: 

BOOL WINAPI RegisterHotKey(_In_opt_   HWND hWnd,      //响应该热键的窗口句柄_In_       int  id,         //该热键的ID,ID值可以是自定义的一个数值_In_       UINT fsModifiers,//该热键的辅助按键例如Ctrl键盘)_In_       UINT vk          //该热键的键值,一个按键码
);

注册热键的例子如下:

//注册一个快捷键:Ctrl +Shift+H
::RegisterHotKey(hWnd, //当前窗口的句柄0x1234, //自定义热键ID值MOD_CONTROL|MOD_SHIFT, //同时按下ctrl,shift'h'); //ctrl+shift+h

        第二步呢,要在消息响应函数里对WM_HOTKEY消息做出反应。这个消息的WPARAM参数,其实就是我们注册热键时自己设定的那个热键ID 。接着在这个消息处理过程中,就能让窗口显示或者隐藏。 

        要是用SDK开发,直接在回调函数里写case WM_HOTKEY消息的处理代码就行。但如果是用MFC开发,因为没办法直接编写消息回调函数,就得在类向导里添加PreTranslateMessage虚函数来处理这个消息。下面就是相关代码: 

BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg) {//判断消息是否是全局热键消息,并判断该热键的ID是否是我们注册过的if ((pMsg->message == WM_HOTKEY) && (pMsg->wParam == 0x1234)) {if (IsWindowVisible(m_hWnd) == TRUE)ShowWindow(SW_HIDE); //隐藏窗口elseShowWindow(SW_SHOW); //显示窗口}return CDialogEx::PreTranslateMessage(pMsg);
}

 四、完整示例demo

MFC任务管理器说明书

4.1 完成的基础功能

1 遍历进程
2 遍历线程
3 遍历模块
4 遍历堆
5 结束进程,挂起线程,恢复运行线程,结束线程
6 获取CPU,内存信息
7 遍历文件信息:文件名,创建时间,修改时间,文件大小
8 遍历窗口信息
9 扫描并清理VS工程垃圾

附加功能如下:
1 老板键及其他快捷键:如ctrl+7隐藏程序,再次恢复显示程序
2 进程列表按列排序,根据整数或者字符串排序显示
3 利用定时器自主设置进程表刷新速度
4 主菜单项:关机,重启,注销,休眠,睡眠,锁屏
5 刷新窗口信息和关闭窗口
6 增加线程更新cpu和内存信息
7 查看有些堆信息有点卡顿,增加线程查看堆信息

开发环境:Windows10+VS2015+CPP

4.2 界面说明

1 菜单选项有:
刷新速度
关机 ctrl+1
重启 ctrl+2
注销 ctrl+3
休眠 ctrl+4
睡眠 ctrl+5
锁屏 ctrl+6
隐藏 ctrl+7

2 CPU利用率 内存占用率

3 TAB选项
进程 文件 窗口 清理

进程:显示进程列表,根据进程ID可以查看对应的线程,模块和堆
文件:查看某文件夹或磁盘的文件
窗口:查看当前所有显示窗口
清理:清理VS工程的工具

4.3 操作说明

        可以鼠标左键单击菜单选项操作,在进程列表,线程模块堆和窗口列表可以使用鼠标右键菜单操作。其他子窗口看界面说明。

        注意事项:程序操作中,如结束进程,挂起线程,恢复运行线程,结束线程,查看模块,堆信息有些会失败,可能因为权限不够或者被限制。

进程

文件

窗口

清理

demo代码:https://download.csdn.net/download/linshantang/90530350

相关文章:

【第39节】windows编程:打造MFC版本任务管理器

目录 一、项目概述 二、项目开发的各种功能关键 2.1 进程信息的获取 2.2 线程信息的获取 2.3 进程模块信息的获取 2.3.1 模块快照 2.3.2 枚举模块 2.4 进程堆信息的获取 2.5 窗口信息的获取 2.6 文件信息的获取 2.7 内存信息和CPU占用率的获取 2.7.1 内存信息相关结…...

1.认识C语言

上层&#xff1a;应用软件 下层&#xff1a;操作系统、硬件 C语言擅长于下层方面 计算机语言的发展&#xff1a;低级 ——> 高级 用计算机的二进制指令写代码&#xff08;低级语言&#xff09; —— > 汇编指令&#xff08;低级语言&#xff0c;用到了助记符&#xff…...

MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题

MySQL下200GB大表备份&#xff0c;利用传输表空间解决停服发版表备份问题 问题背景 在停服发版更新时&#xff0c;需对 200GB 大表&#xff08;约 200 亿行数据&#xff09;进行快速备份以预防操作失误。 因为曾经出现过有开发写的发版语句里&#xff0c;UPDATE语句的WHERE条…...

《Sqoop 快速上手:安装 + 测试实战》

推荐原文 见&#xff1a;http://docs.xupengboo.top/bigdata/di/sqoop.html Sqoop&#xff08;SQL-to-Hadoop&#xff09; 是 Apache 开源的工具&#xff0c;专门用于在 Hadoop 生态系统&#xff08;如 HDFS、Hive、HBase&#xff09; 和 关系型数据库&#xff08;如 MySQL、O…...

MySQL体系架构(二)

MySQL中的目录和文件 2.2.1.bin目录 在MysQL的安装目录下有一个特别特别重要的bin目录,这个目录下存放着许多可执行文件。 其他系统中的可执行文件与此的类似。这些可执行文件都是与服务器程序和客户端程序相关的。 2.2.1.1.启动MySQL服务器程序 在UNIX系统中用来启动MySO…...

为什么反激采用峰值电流控制模式而非电压模式

电压模式控制是传统的控制方法&#xff0c;通过检测输出电压&#xff0c;与参考电压比较&#xff0c;然后调整PWM的占空比。这种方法的优点是简单&#xff0c;只需要一个电压反馈环路。但缺点可能包括对输入电压变化的响应较慢&#xff0c;动态性能不足&#xff0c;尤其是在负载…...

JavaScript逆向工程中的插桩技术完全指南

一、什么是插桩技术&#xff1f; 插桩&#xff08;Instrumentation&#xff09;是逆向工程中的核心技术之一&#xff0c;指的是在不改变程序原有逻辑的前提下&#xff0c;向目标程序中插入额外的代码或监控点&#xff0c;用于收集运行时信息、修改程序行为或进行调试分析。 插…...

LLM应用实战1-基本概念

文章目录 基本概念1. 提示词工程&#xff08;Prompt Engineering&#xff09;2. AI Agent&#xff08;智能代理&#xff09;3. Model Context Protocol (MCP)4. Function Calling&#xff08;函数调用&#xff09;5. Retrieval-Augmented Generation (RAG)6. FineTuning&#x…...

数据结构--堆

一、堆的定义 堆是一棵完全二叉树&#xff0c;树中的每个结点的值都不小于&#xff08;或不大于&#xff09;其左右孩子结点的值。其中&#xff0c;如果父亲结点的值始终大于或等于孩子结点的值&#xff0c;那么称这样的堆为大顶堆&#xff0c;这时每个结点的值都是以它为根节…...

第37次CCF计算机软件能力认证 / T4 / 集体锻炼

题目 代码 #include <bits/stdc.h> using namespace std; using LL long long;const int N 1e6 10; const int mod 998244353; int a[N]; int st[N][22];int get(int l, int r) {int x r - l 1;int k log2(x);return __gcd(st[l][k], st[r - (1 << k) 1][…...

ES6规范新特性总结

ES6新特性 var、let和const不存在变量提升暂时性死区不允许重复声明 解构赋值用途&#xff1a;交换变量的值从函数返回多个值提取JSON数据遍历map结构输入模块的制定方法 字符串的扩展codePointAt()String.fromCharCode()at()includes(),startsWith(),endsWith()repeat()padSta…...

AI模型多阶段调用进度追踪系统设计文档

AI模型多阶段调用进度追踪系统设计文档 一、系统概述 为解决AI模型处理大型文件时响应时间长的问题&#xff0c;我们设计并实现了一套异步进度追踪系统。该系统采用Server-Sent Events (SSE) 技术&#xff0c;建立从服务器到客户端的单向实时通信通道&#xff0c;使前端能够实…...

[MSPM0开发]最新版ccs20.0安装、配置及导入第一个项目

一、ccs20.0 下载与安装 Code Composer Studio™ 集成式开发环境 (IDE)&#xff0c;适用于 TI 微控制器和处理器的集成开发环境 (IDE)。它包含一整套丰富的工具&#xff0c;用于构建、调试、分析和优化嵌入式应用。 ccs下载地址 链接 安装比较简单&#xff0c;在次略过。 二、…...

Win10怎么关闭远程控制?

对于Windows 10用户来说&#xff0c;Win10关闭远程桌面可以有效防止不必要的远程连接&#xff0c;从而保护个人数据和系统安全。那么&#xff0c;Win10怎么关闭远程控制功能呢&#xff1f;接下来&#xff0c;我们将详细介绍Win10关闭远程控制的具体操作步骤。 步骤1.双击桌面上…...

AI重构知识生态:大模型时代的学习、创作与决策革新

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:从知识的获取到知识的共生 过去,我们对“知识”的理解,大多依赖书籍、老师、经验和专业的培训体系。而在大语言模型(Large Language Models, LLM)崛起之后,AI成为了一种新的“知识界面”:…...

牛客 小红杀怪

通过枚举所有使用y技能的次数来枚举出所有方案&#xff0c;选出最合适的 #include<iostream> #include<cmath> #include<algorithm> using namespace std;int a, b, x, y; int ans500;int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>&…...

Spring入门概念 以及入门案例

Spring入门案例 Springspring是什么spring的狭义与广义spring的两个核心模块IoCAOP Spring framework特点spring入门案例不用new方法&#xff0c;如何使用返回创建的对象 容器&#xff1a;IoC控制反转依赖注入 Spring spring是什么 spring是一款主流的Java EE轻量级开源框架 …...

SpringAI调用硅基流动免费模型

一、引入Spring AI 新建一个Spring Boot的工程&#xff0c;在工程中引入Spring AI的依赖&#xff0c;Spring AI支持Ollma、类OpenAI的接口&#xff0c;这两个引入的pom不一样&#xff0c;这里示例中是使用的硅基流动的模型 <!-- Spring Boot版本要 2.x 或者 3.x以上-->…...

Java 开发中主流安全框架的详细对比,涵盖 认证、授权、加密、安全策略 等核心功能,帮助开发者根据需求选择合适的方案

以下是 Java 开发中主流安全框架的详细对比&#xff0c;涵盖 认证、授权、加密、安全策略 等核心功能&#xff0c;帮助开发者根据需求选择合适的方案&#xff1a; 1. 主流安全框架对比表 框架名称类型核心功能适用场景优点缺点官网/文档Spring Security企业级安全框架认证、授…...

【TVM教程】在支持 CMSIS-NN 的 Arm(R) Cortex(R)-M55 CPU 和 Ethos(TM)-U55 NPU 裸机上运行 TVM

Apache TVM是一个深度的深度学习编译框架&#xff0c;适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →https://tvm.hyper.ai/ 作者&#xff1a;Grant Watson 本节使用示例说明如何使用 TVM 在带有 CMSIS-NN 的 Arm Cortex-M55 CPU 和 Ethos™-U55 NPU 的…...

【Ai/Agent】Windows11中安装CrewAI过程中的错误解决记录

CrewAi是什么&#xff0c;可以看之下之前写的 《初识CrewAI多智能代理团队协框架》 (注&#xff1a;这篇是基于linux系统下安装实践的) 基于以下记录解决问题后&#xff0c;可以再回到之前的文章继续进行CrewAI的安装 遇到问题 在windows系统中安装 CrewAi 不管是使用 pip 或者…...

洛谷 P11962:[GESP202503 六级] 树上漫步 ← dfs + 邻接表

【题目来源】 https://www.luogu.com.cn/problem/P11962 【题目描述】 小 A 有一棵 n 个结点的树&#xff0c;这些结点依次以 1,2,⋯,n 标号。 小 A 想在这棵树上漫步。具体来说&#xff0c;小 A 会从树上的某个结点出发&#xff0c;每⼀步可以移动到与当前结点相邻的结点&…...

Linux shell脚本编程

什么是Shell程序设计&#xff1f; 也就是给计算机发命令&#xff0c;让它帮你做事&#xff0c;你通过shell 的小工具&#xff0c;用键盘输入指令&#xff0c;linux就会根据这些指令去执行任务&#xff0c;就像你法号一个指令一样。 shell的强大之处&#xff1f; 文件处理&a…...

嵌入式硬件篇---Uart和Zigbee

文章目录 前言一、UART&#xff08;通用异步收发传输器&#xff09;1. 基本概念2. 工作原理帧结构起始位数据位校验位停止位 异步通信波特率 3. 特点优点缺点 4. 典型应用 二、ZigBee1. 基本概念2. 技术细节工作频段2.4GHz868MHz 网络拓扑星型网络网状网络簇状网络 协议栈物理层…...

Linux Makefile-概述、语句格式、编写规则、多文件编程、Makefile变量分类:自定义变量、预定义变量

目录 1.make 1.1 make 命令格式 2.Makefile 核心概念‌ ‌ 2.1创建并运行 Makefile步骤 3. Makefile编写 3.1最基础Makefile 3.1.1使用默认make命令 3.1.2使用make -f 命令 3.1.3 gcc编译常用组合选项 3.1.4 make 和 make all区别 3.1.4.1 all 是默认目标 3.1.4.2 al…...

Kotlin日常使用函数记录

文章目录 前言字符串集合1.两个集合的差集2.集合转数组2.1.集合转基本数据类型数组2.2.集合转对象数组 Map1.合并Map1.1.使用 操作符1.2.使用 操作符1.3.使用 putAll 方法1.4.使用 merge 函数 前言 记录一些kotlin开发中&#xff0c;日常使用的函数和方式之类的&#xff0c;…...

【JavaScript】异步编程

个人主页&#xff1a;Guiat 归属专栏&#xff1a;HTML CSS JavaScript 文章目录 1. 异步编程基础1.1 同步与异步1.1.1 同步执行1.1.2 异步执行 1.2 JavaScript 事件循环 2. 回调函数2.1 基本回调模式2.2 错误处理2.3 回调地狱 3. Promise3.1 Promise 基础3.2 Promise 链式调用3…...

批量合并多张 jpg/png 图片为长图或者 PDF 文件,支持按文件夹合并图片

我们经常会碰到需要将多张图片拼成一张图片的场景&#xff0c;比如将多张图片拼成九宫格图片&#xff0c;或者将多张图片拼成一张长图。还有可能会碰到需要将多张图片合并成一个完整的 PDF 文件来方便我们进行打印或者传输等操作。那这些将图片合并成一张图片或者一个完整的文档…...

使用docker 安装向量数据库Milvus

Miluvs 官网 www.milvus.io/ https://milvus.io/docs/zh/install_standalone-docker-compose-gpu.md 一、基本概念 向量数据库&#xff1a;Milvus是一款云原生向量数据库&#xff0c;它支持多种类型的向量&#xff0c;如浮点向量、二进制向量等&#xff0c;并且可以处理大规模…...

在线PDF文件拆分工具,小白工具功能实用操作简单,无需安装的文档处理工具

小白工具中的在线 PDF 文件拆分工具是一款功能实用、操作便捷的文档处理工具&#xff0c;以下是其具体介绍&#xff1a; 操作流程 上传 PDF 文档&#xff1a;打开小白工具在线PDF文件拆分工具 - 快速、免费拆分PDF文档 - 小白工具的在线 PDF 文件拆分页面&#xff0c;通过点击 …...

Blender画图——阵列使用

如图我需要多个图示的图形&#xff0c;并且排成一个阵列效果。 如图依次点击效果。不要用相对偏移&#xff0c;要用恒定偏移。 如图设置数量。 如图完成x方向的画图后&#xff0c;我们需要在y方向再用一个阵列。...

VSCode 常用快捷键

Visual Studio Code (VSCode) 提供了许多快捷键&#xff0c;以帮助开发者提高编码效率。以下是一些常用的 VSCode 快捷键&#xff0c;这些快捷键适用于大多数操作系统&#xff0c;但在 macOS 上可能会有所不同&#xff08;通常是将 Ctrl 替换为 Cmd&#xff09;。 1. 文件和编…...

缓存相关问题

Redis 持久化机制 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题 热点数据和冷数据是什么 Memcache与Redis的区别都有哪些? 单线程的redis为什么这么快 redis的数据类型,以及每种数据类型的使用场景,Redis 内部结构 redis的过期策略以及内存淘汰机制 Redis 为什么…...

每日一题(小白)暴力娱乐篇22

为什么要经常学习暴力和一些娱乐呢&#xff1f;因为对于我们来说&#xff0c;暴力是最直接的方式是肯定能满足一部分答案的方法&#xff0c;娱乐是为了让算法变得更有趣&#xff0c;你愿意多去尝试多去练习&#xff0c;这才是最要紧的。 由题意知&#xff0c;就是计算两个数字…...

深入理解 Vuex:核心概念、API 详解与最佳实践

目录 Vuex 简介核心概念与工作流程核心 API 详解模块化开发 &#xff08;modules&#xff09;插件&#xff08;Plugins&#xff09;与扩展高级技巧与最佳实践 Vuex 简介 Vuex 是 Vue.js 的官方状态管理库&#xff0c;专为复杂应用设计&#xff0c;用于集中管理所有组件的共享状…...

成为一种国家战略范畴的新基建的智慧园区开源了。

智慧园区场景视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用户只需在界…...

拜特科技助力科达制造,资金管理信息化迈入新阶段

近日&#xff0c;拜特科技成功签约科达制造股份有限公司&#xff08;以下简称“科达制造”&#xff09;资金管理系统升级项目。科达制造通过资金管理系统的不断迭代升级和优化&#xff0c;能够更加高效地管理和运用资金&#xff0c;提高企业的资金利用效率&#xff0c;满足企业…...

每日一题(小白)暴力娱乐篇20

这个题用瞪眼法解决&#xff0c;snakeaekns 代码如下&#x1f447; public static void main(String[] args) {Scanner scannew Scanner(System.in);System.out.println("aekns");scan.close();} 第二种方式&#xff1a;将snack拆解&#xff0c;按照大小进行排序。…...

Flutter iOS 项目中 VolumeControllerPlugin 报错解决方案

Flutter iOS 项目中 VolumeControllerPlugin 报错解决方案 在开发 Flutter 应用时&#xff0c;有时会遇到 iOS 项目构建失败的情况&#xff0c;其中一种较为常见的错误是与 VolumeControllerPlugin 相关的报错&#xff0c;错误信息如下&#xff1a; Could not build the prec…...

Java实战报错 tcp

为什么报错tcp Preview 从图片中的错误信息来看&#xff0c;程序遇到了 java.net.BindException&#xff0c;具体错误信息是 "Address already in use: bind"。这意味着你的程序试图绑定到一个已经被其他进程占用的端口&#xff08;在本例中是9999端口&#xff09;。…...

【补题】P10424 [蓝桥杯 2024 省 B] 好数(数位dp)

题意&#xff1a; 一个整数如果按从低位到高位的顺序&#xff0c;奇数位&#xff08;个位、百位、万位……&#xff09;上的数字是奇数&#xff0c;偶数位&#xff08;十位、千位、十万位……&#xff09;上的数字是偶数&#xff0c;我们就称之为“好数”。 给定一个正整数 N…...

控制 ElementUI el-table 树形表格多选框的显示层级

1、你可以通过 selectable 属性来控制哪些行可以选择&#xff08;显示多选框&#xff09; <el-table:data"tableData"row-key"id"default-expand-all:tree-props"{children: children, hasChildren: hasChildren}"select"handleSelect&…...

今日行情明日机会——20250409

今日行情还需要考虑关税对抗~ 2025年4月8日涨停的主要行业方向分析 1. 军工&#xff08;19家涨停&#xff09; 细分领域&#xff1a;国防装备、航空航天、军民融合。催化因素&#xff1a;国家安全战略升级、国防预算增加、重大军工项目落地预期。 2. 免税&#xff08;15家涨…...

基础知识补充篇:什么是DAPP前端连接中的provider

专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读352次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。后续也会在此规划一下后续内容,因此如果遇到不能点击的,代表还没有更新。声明:文中所出观点大多数源于笔者多年开发经验所总结,如果你想要知道区块…...

47常用控件_QWidget的toolTip属性

一个 GUI 程序,界面比较复杂, 按啥的很多~~ 当你把鼠标悬停到这个控件上的时候,就能弹出一个提示~~ setToolTip&#xff1a;设置提示内容 setToolTipDuring&#xff1a;设置提示的时间 toolTip 只是给用户看的.在代码中一般不需要获取到 toolTip. 代码示例: 设置按钮的 toolT…...

解密工业控制柜:认识关键硬件(PLC)

前言 作为一名视觉开发工程师&#xff0c;我们不仅要做到做好自己的工作&#xff0c;我们更需要在工业现场学习更多知识&#xff0c;最近网上流传很多&#xff0c;“教会徒弟&#xff0c;饿死师傅”&#xff1b;在自动化行业中&#xff0c;在项目下来很忙的时候&#xff0c;我们…...

PDF编辑,小白工具功能丰富多样,在线无需下载,操作便捷,新手小白必备

在当今数字化办公和学习的时代&#xff0c;PDF 文件的使用极为广泛&#xff0c;而小白工具的在线 PDF 浏览器以其强大且丰富的功能&#xff0c;成为了一款不可多得的优质 PDF 阅读工具&#xff0c;PDF编辑,在线无需下载,操作便捷,新手小白必备以下为您详细推荐&#xff1a; 功能…...

网络安全公司推荐:F5荣膺IDC全球Web应用与API防护领导者

API的广泛使用正推动安全实践的重大变革。研究表明&#xff0c;有41%的企业管理的API数量至少与应用数量相等&#xff0c;因此企业亟需实现全面的API防护。近日&#xff0c;IDC发布《IDC MarketScape&#xff1a;2024年全球Web应用和API防护企业平台供应商评估报告》&#xff0…...

WPF轮播图动画交互 动画缩放展示图片

WPF轮播图动画交互 动画缩放展示图片 效果如下图&#xff1a; XAML代码&#xff1a; <Window x:Class"Caroursel.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/20…...

玩转Docker | 使用Docker安装FileDrop文件共享工具

玩转Docker | 使用Docker安装FileDrop文件共享工具 前言一、FileDrop介绍FileDrop简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署FileDrop服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问FileDrop应用创建名称五、测试与使用…...