项目实战:使用Windows API实现程序性能监控
目录1.项目介绍2.Windows API介绍3.项目开源前言Windows系统区别与Linux系统并没有那么多的开源工具对系统的开放性也比较差所以导致很多情况下程序出现问题时不能很好的定位程序发生问题的地方而使用Ai或者查阅相关的博客推荐的工具都是Linux系统下的为了解决这个问题所以博主写了这篇《项目实战使用Windows API实现程序性能监控》。本篇博客主要是为了使用Windows API来监控程序防止某些偶发性的Bug导致程序异常时系统无法提供完善的信息来使我们定位问题。项目介绍本文初始项目是使用Visual Studio Qt6编写的其中Qt作为可视化前端界面输出监控的信息主要功能则是在systemMonitor类中其中每一个XXXMonitor文件夹对应监控不同的信息有进程信息IO信息内存信息和CPU信息。如果需要使用对应的监控可以把对应的文件夹迁移到项目中即可如果需要使用全部的监控功能则只需要拷贝systemMonitor类和XXXMonitor文件夹即可实现监控信息的输出当前项目的结构如下项目 ├── QtMonitor.sln └── QtMonitor ├── cpuMonitor │ ├── cpuMonitor.h │ └── cpuMonitor.cpp ├── ioMonitor │ ├── ioMonitor.h │ └── ioMonitor.cpp ├── memoryMonitor │ ├── memoryMonitor.h │ └── memoryMonitor.cpp ├── threadMonitor │ ├── threadMonitor.h │ └── threadMonitor.cpp ├── main.cpp ├── QtMonitor.h ├── QtMonitor.cpp ├── QtMonitor.ui ├── QtMonitor.qrc ├── systemMonitor.h ├── systemMonitor.cpp └── io_test.txt项目所实现的功能也比较简单具体如图图1.项目概况Windows API介绍在当前项目中使用了很多Windows API本小节则主要讲解这些API和API相关的参数。具体如下1.GetSystemInfo获取CPU核心/逻辑处理器数量void GetSystemInfo( LPSYSTEM_INFO lpSystemInfo // 输出参数 ); SYSTEM_INFO 结构体说明 typedef struct _SYSTEM_INFO { union { DWORD dwOemId; // 旧版本字段现代代码通常不直接使用 struct { WORD wProcessorArchitecture; // 处理器架构例如 x86、x64、ARM WORD wReserved; // 保留字段 }; }; DWORD dwPageSize; // 内存页大小单位为字节 LPVOID lpMinimumApplicationAddress; // 应用程序可访问的最低内存地址 LPVOID lpMaximumApplicationAddress; // 应用程序可访问的最高内存地址 DWORD_PTR dwActiveProcessorMask; // 当前活动处理器掩码 DWORD dwNumberOfProcessors; // 当前系统逻辑处理器数量 DWORD dwProcessorType; // 处理器类型旧字段通常不再推荐依赖 DWORD dwAllocationGranularity; // 虚拟内存分配粒度单位为字节 WORD wProcessorLevel; // 处理器级别 WORD wProcessorRevision; // 处理器版本 } SYSTEM_INFO;2.GetCurrentProcess获取当前进程的伪句柄HANDLE GetCurrentProcess(void); 返回值类型 HANDLE 返回当前进程的伪句柄。该句柄只代表当前进程不需要调用CloseHandle关闭 是Windows对系统对象的句柄类型例如进程、线程、快照等3.GetProcessTimes获取指定进程的时间信息项目中用于计算当前进程CPU占用率BOOL GetProcessTimes( HANDLE hProcess, // 进程句柄 LPFILETIME lpCreationTime, // 接收进程创建时间 LPFILETIME lpExitTime, // 接收进程退出时间进程未退出时通常无有效退出时间 LPFILETIME lpKernelTime, // 接收进程在内核态消耗的CPU时间 LPFILETIME lpUserTime // 接收进程在用户态消耗的CPU时间 ); 返回值FILETIME结构体说明 返回非0表示调用成功。 返回0表示调用失败可通过GetLastError获取错误原因 项目中使用lpKernelTime lpUserTime的增量计算当前进程CPU使用率 typedef struct _FILETIME { DWORD dwLowDateTime; // 64位时间值的低32位 DWORD dwHighDateTime; // 64位时间值的高32位 } FILETIME;4.GetSystemTimes获取系统整体CPU时间BOOL GetSystemTimes( LPFILETIME lpIdleTime, // 接收系统空闲时间 LPFILETIME lpKernelTime, // 接收系统内核态时间该值包含空闲时间 LPFILETIME lpUserTime // 接收系统用户态时间 ); 返回值FILETIME结构体 返回非0表示调用成功 返回0表示调用失败可通过GetLastError获取错误原因 typedef struct _FILETIME { DWORD dwLowDateTime; // 64位时间值的低32位 DWORD dwHighDateTime; // 64位时间值的高32位 } FILETIME;5.GetProcessIoCounters获取指定进程的I/O统计信息BOOL GetProcessIoCounters( HANDLE hProcess, // 进程句柄 PIO_COUNTERS lpIoCounters // 指向IO_COUNTERS结构体函数会写入进程I/O计数 ); 返回值IO_COUNTERS结构体说明 返回非0表示调用成功 返回0表示调用失败可通过GetLastError获取错误原因 typedef struct _IO_COUNTERS { ULONGLONG ReadOperationCount; // 读操作次数 ULONGLONG WriteOperationCount; // 写操作次数 ULONGLONG OtherOperationCount; // 其他 I/O 操作次数 ULONGLONG ReadTransferCount; // 读传输字节总数 ULONGLONG WriteTransferCount; // 写传输字节总数 ULONGLONG OtherTransferCount; // 其他 I/O 传输字节总数 } IO_COUNTERS;6.GetProcessMemoryInfo获取指定进程的内存使用信息BOOL GetProcessMemoryInfo( HANDLE Process, // 进程句柄 PPROCESS_MEMORY_COUNTERS ppsmemCounters, // 指向PROCESS_MEMORY_COUNTERS或 PROCESS_MEMORY_COUNTERS_EX结构体 DWORD cb // 结构体大小 ); 返回值PROCESS_MEMORY_COUNTERS_EX结构体说明 返回非0表示调用成功 返回0表示调用失败可通过 GetLastError 获取错误原因 typedef struct _PROCESS_MEMORY_COUNTERS_EX { DWORD cb; // 结构体大小 DWORD PageFaultCount; // 页面错误次数 SIZE_T PeakWorkingSetSize; // 峰值工作集大小单位为字节 SIZE_T WorkingSetSize; // 当前工作集大小单位为字节 SIZE_T QuotaPeakPagedPoolUsage; // 分页池配额峰值 SIZE_T QuotaPagedPoolUsage; // 当前分页池配额使用量 SIZE_T QuotaPeakNonPagedPoolUsage; // 非分页池配额峰值 SIZE_T QuotaNonPagedPoolUsage; // 当前非分页池配额使用量 SIZE_T PagefileUsage; // 当前提交/页面文件使用量单位为字节 SIZE_T PeakPagefileUsage; // 峰值提交/页面文件使用量单位为字节 SIZE_T PrivateUsage; // 当前进程私有提交内存单位为字节 } PROCESS_MEMORY_COUNTERS_EX;7.GetCurrentProcessId获取当前进程IDDWORD GetCurrentProcessId(void); 返回值DWORD类型说明 返回当前进程的进程 ID。 typedef unsigned long DWORD; // Windows常用的32位无符号整数类型8.CreateToolhelp32Snapshot创建系统快照HANDLE CreateToolhelp32Snapshot( DWORD dwFlags, // 采集系统线程快照 DWORD th32ProcessID // 进程ID集线程快照时该参数通常传0 ); 返回值说明 成功时返回快照句柄 失败时返回INVALID_HANDLE_VALUE 该函数返回的是真实句柄使用完成后必须调用CloseHandle关闭9.Thread32First获取线程快照中的第一条线程记录BOOL Thread32First( HANDLE hSnapshot, // CreateToolhelp32Snapshot返回的线程快照句柄 LPTHREADENTRY32 lpte // 指向THREADENTRY32结构体调用前必须设置lpte-dwSize sizeof(THREADENTRY32)。 ); 返回值THREADENTRY32结构体说明 返回TRUE表示成功获取第一条线程记录 返回FALSE表示失败可能是快照为空或句柄无效 typedef struct tagTHREADENTRY32 { DWORD dwSize; // 结构体大小调用Thread32First前必须设置 DWORD cntUsage; // 线程引用计数通常不使用 DWORD th32ThreadID; // 线程ID DWORD th32OwnerProcessID; // 拥有该线程的进程ID LONG tpBasePri; // 线程基础优先级 LONG tpDeltaPri; // 线程优先级增量通常不使用 DWORD dwFlags; // 保留字段 } THREADENTRY32;10.Thread32Next获取线程快照中的下一条线程记录BOOL Thread32Next( HANDLE hSnapshot, // CreateToolhelp32Snapshot返回的线程快照句柄 LPTHREADENTRY32 lpte // 指向THREADENTRY32结构体用于接收下一条线程记录 ); 返回值THREADENTRY32结构体说明 返回TRUE表示成功获取下一条线程记录 返回FALSE表示没有更多线程记录或调用失败 typedef struct tagTHREADENTRY32 { DWORD dwSize; // 结构体大小 DWORD cntUsage; // 线程引用计数通常不使用 DWORD th32ThreadID; // 线程ID DWORD th32OwnerProcessID; // 拥有该线程的进程ID LONG tpBasePri; // 线程基础优先级 LONG tpDeltaPri; // 线程优先级增量通常不使用 DWORD dwFlags; // 保留字段 } THREADENTRY32;11.CloseHandle关闭一个已打开的 Windows 对象句柄BOOL CloseHandle( HANDLE hObject // 需要关闭的对象句柄 ); 返回值说明 返回非0表示关闭成功。 返回0表示关闭失败可通过GetLastError获取错误原因 注意CreateToolhelp32Snapshot返回的快照句柄需要CloseHandle GetCurrentProcess返回的是当前进程伪句柄不需要CloseHandle项目开源https://github.com/3020Xmy/QtMonitorhttps://github.com/3020Xmy/QtMonitor

相关新闻

实测对比:NVIDIA-Nemotron-3-Nano-4B-OptiQ-4bit vs 普通4bit量化,6大能力指标全面碾压

实测对比:NVIDIA-Nemotron-3-Nano-4B-OptiQ-4bit vs 普通4bit量化,6大能力指标全面碾压

实测对比:NVIDIA-Nemotron-3-Nano-4B-OptiQ-4bit vs 普通4bit量化,6大能力指标全面碾压 【免费下载链接】NVIDIA-Nemotron-3-Nano-4B-OptiQ-4bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/NVIDIA-Nemotron-3-Nano-4B-OptiQ-4bit …

2026/7/13 16:52:42阅读更多 →
发顶刊缺数据?看云克隆 ELISA 如何支撑 ACS Nano 级研究

发顶刊缺数据?看云克隆 ELISA 如何支撑 ACS Nano 级研究

顶刊数据背后的“隐形功臣”:从 ACS Nano 研究看 ELISA 的精准支撑在生命科学研究的深水区,一篇能够登上《ACS Nano》这类顶级期刊的论文,往往不仅依赖于精妙的实验设计或新颖的材料合成,更离不开底层检测数据的坚实支撑。近期&am…

2026/7/13 16:47:41阅读更多 →
光源色温偏差500K,AI质检的色差检测会偏多少?

光源色温偏差500K,AI质检的色差检测会偏多少?

在工业质检、印刷、纺织、电子产品外观检测等领域,基于机器视觉的AI色差检测系统正被广泛应用。这类系统的核心原理是通过工业相机捕捉物体在标准光源下的颜色信息,再与标准色板或CAD数据进行比对,从而判断产品颜色是否合格。然而&#xff0c…

2026/7/13 16:47:41阅读更多 →
《编译原理及实践 ARM架构处理器视角》 全套PPT课件

《编译原理及实践 ARM架构处理器视角》 全套PPT课件

《编译原理及实践 ARM架构处理器视角》 全套PPT课件 课件参考 :《编译原理及实践 ARM架构处理器视角》 陈果教材 课件内容: 1-引言.pptx 2-词法分析.pptx 3-语法分析.pptx 4-语法制导翻译.pptx 5-语义分析.pptx 6-代码生成.pptx 7-中间表示.pptx 8-代码优…

2026/7/13 17:47:46阅读更多 →
Commit Mono 字体终极配置指南:3步快速提升代码阅读体验

Commit Mono 字体终极配置指南:3步快速提升代码阅读体验

Commit Mono 字体终极配置指南:3步快速提升代码阅读体验 【免费下载链接】commit-mono Commit Mono is an anonymous and neutral programming typeface. 项目地址: https://gitcode.com/gh_mirrors/co/commit-mono Commit Mono 是一款专注于提升代码阅读体验…

2026/7/13 17:47:46阅读更多 →
《系统级编程及分布式应用实现技术》 全套PPT课件

《系统级编程及分布式应用实现技术》 全套PPT课件

《系统级编程及分布式应用实现技术》 全套PPT课件 课件参考:《系统级编程及分布式应用实现技术》 李传煌 教材 课件内容: 第1章系统级软件构建基础.pp 第2章 系统级软件多任务编程技术。ppt 第3章系统级软件开发中的死锁问题。pp女 第4章软件系统网络通信…

2026/7/13 17:47:46阅读更多 →
《Python程序设计与数据分析》全套PPT课件

《Python程序设计与数据分析》全套PPT课件

《Python程序设计与数据分析》全套PPT课件 课件参考:《Python程序设计与数据分析》 汪小燕 教材 课件内容: 第1章 Python语言概述.pptx 第2章 Python语言基础.pptx 第3章 Python流程控制语句.pptx 第4章序列类型.pptx 第5章字符串与正则表达式.ppx 第6章…

2026/7/13 17:47:46阅读更多 →
揭秘www.sh框架:用Shell脚本实现路由与模板引擎的神奇方法

揭秘www.sh框架:用Shell脚本实现路由与模板引擎的神奇方法

揭秘www.sh框架:用Shell脚本实现路由与模板引擎的神奇方法 【免费下载链接】www.sh Web framework in Bash 项目地址: https://gitcode.com/gh_mirrors/ww/www.sh www.sh 是一款颠覆认知的实验性Web框架,它以Shell脚本为核心,实现了传…

2026/7/13 17:47:46阅读更多 →
深度学习(18)--从原理到实践:三大注意力机制核心代码解析

深度学习(18)--从原理到实践:三大注意力机制核心代码解析

1. 注意力机制的本质与核心价值当你第一次听说"注意力机制"这个词时,脑海中可能会浮现人类集中注意力的场景。事实上,深度学习中的注意力机制正是受此启发而来。想象一下你在阅读这篇文章时,不会对每个字都投入相同的精力&#xff…

2026/7/13 17:42:46阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/13 4:47:19阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/13 0:50:34阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/13 4:52:09阅读更多 →
卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

研究痛点提出(提出问题)重组肠激酶是融合标签切除核心工具酶,当前原核表达体系存在三大标准化难题,直接阻碍可复现的蛋白质分离纯化流程搭建:Trx、GST、单 SUMO 标签融合产物绝大多数为包涵体,沉淀占比超 9…

2026/7/13 0:04:58阅读更多 →
语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools:让音频整理变得简单高效 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate text …

2026/7/13 0:04:58阅读更多 →
Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools 你是否曾经想要调整Palwor…

2026/7/13 0:04:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/13 4:21:17阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/13 4:08:53阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/12 21:43:43阅读更多 →