VB.NET 在 Windows下通过WIn32API获取CPU和内存的使用率
.net 要获取CPU和内存的使用率,一般是通过 PerformanceCounter 或者 WMI 查询得到,但是如果操作系统经常不正常断电或者别的什么原因,让系统的性能计数器抽风了,可能就会造成初始化 PerformanceCounter 对象出错。
性能计数器错误一般可以通过 lodctr /r 可以修复,但是时不时要这么搞一下,对用户总是太不友好了,所以能通过 Win32API 来获取也是一个不错的选项。
代码已封装到两个工具类 CpuUsageNt 和 MemUsage 里面了


''' <summary>
''' Inherits the CPUUsage class and implements the Query method for Windows NT systems.
''' </summary>
''' <remarks>
''' <p>This class works on Windows NT4, Windows 2000, Windows XP, Windows .NET Server and higher.</p>
''' </remarks>
Private NotInheritable Class CpuUsageNt
''' <summary>
''' Initializes a new CpuUsageNt instance.
''' </summary>
''' <exception cref="NotSupportedException">One of the system calls fails.</exception>
Public Sub New()
Dim timeInfo(31) As Byte ' SYSTEM_TIME_INFORMATION structure
Dim perfInfo(311) As Byte ' SYSTEM_PERFORMANCE_INFORMATION structure
Dim baseInfo(43) As Byte ' SYSTEM_BASIC_INFORMATION structure
Dim ret As Integer If (Environment.OSVersion.Platform <> PlatformID.Win32NT) Then
Throw New NotSupportedException()
End If ' get new system time
ret = NtQuerySystemInformation(SYSTEM_TIMEINFORMATION, timeInfo, timeInfo.Length, IntPtr.Zero)
If ret <> NO_ERROR Then
Throw New NotSupportedException()
End If
' get new CPU's idle time
ret = NtQuerySystemInformation(SYSTEM_PERFORMANCEINFORMATION, perfInfo, perfInfo.Length, IntPtr.Zero)
If ret <> NO_ERROR Then
Throw New NotSupportedException()
End If
' get number of processors in the system
ret = NtQuerySystemInformation(SYSTEM_BASICINFORMATION, baseInfo, baseInfo.Length, IntPtr.Zero)
If ret <> NO_ERROR Then
Throw New NotSupportedException()
End If
' store new CPU's idle and system time and number of processors
_oldIdleTime = BitConverter.ToInt64(perfInfo, 0) ' SYSTEM_PERFORMANCE_INFORMATION.liIdleTime
_oldSystemTime = BitConverter.ToInt64(timeInfo, 8) ' SYSTEM_TIME_INFORMATION.liKeSystemTime
_processorCount = baseInfo(40)
End Sub ''' <summary>
''' Determines the current average CPU load.
''' </summary>
''' <returns>An integer that holds the CPU load percentage.</returns>
''' <exception cref="NotSupportedException">One of the system calls fails. The CPU time can not be obtained.</exception>
Public Function Query() As Integer
Dim timeInfo(31) As Byte ' SYSTEM_TIME_INFORMATION structure
Dim perfInfo(311) As Byte ' SYSTEM_PERFORMANCE_INFORMATION structure ' get new system time
Dim ret As Integer = NtQuerySystemInformation(SYSTEM_TIMEINFORMATION, timeInfo, timeInfo.Length, IntPtr.Zero)
If ret <> NO_ERROR Then
Throw New NotSupportedException()
End If
' get new CPU's idle time
ret = NtQuerySystemInformation(SYSTEM_PERFORMANCEINFORMATION, perfInfo, perfInfo.Length, IntPtr.Zero)
If ret <> NO_ERROR Then
Throw New NotSupportedException()
End If
' CurrentValue = NewValue - OldValue
Dim dbIdleTime As Double = BitConverter.ToInt64(perfInfo, 0) - _oldIdleTime
Dim dbSystemTime As Double = BitConverter.ToInt64(timeInfo, 8) - _oldSystemTime
' CurrentCpuIdle = IdleTime / SystemTime
If dbSystemTime <> 0 Then
dbIdleTime = dbIdleTime / dbSystemTime
End If
' CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
dbIdleTime = 100.0 - dbIdleTime * 100.0 / _processorCount + 0.5
' store new CPU's idle and system time
_oldIdleTime = BitConverter.ToInt64(perfInfo, 0) ' SYSTEM_PERFORMANCE_INFORMATION.liIdleTime
_oldSystemTime = BitConverter.ToInt64(timeInfo, 8) ' SYSTEM_TIME_INFORMATION.liKeSystemTime
Return CInt(Fix(dbIdleTime))
End Function ''' <summary>
''' NtQuerySystemInformation is an internal Windows function that retrieves various kinds of system information.
''' </summary>
''' <param name="dwInfoType">One of the values enumerated in SYSTEM_INFORMATION_CLASS, indicating the kind of system information to be retrieved.</param>
''' <param name="lpStructure">Points to a buffer where the requested information is to be returned. The size and structure of this information varies depending on the value of the SystemInformationClass parameter.</param>
''' <param name="dwSize">Length of the buffer pointed to by the SystemInformation parameter.</param>
''' <param name="returnLength">Optional pointer to a location where the function writes the actual size of the information requested.</param>
''' <returns>Returns a success NTSTATUS if successful, and an NTSTATUS error code otherwise.</returns>
<DllImport("ntdll", EntryPoint:="NtQuerySystemInformation")>
Private Shared Function NtQuerySystemInformation(ByVal dwInfoType As Integer,
ByVal lpStructure() As Byte,
ByVal dwSize As Integer,
ByVal returnLength As IntPtr) As Integer
End Function ''' <summary>Returns the number of processors in the system in a SYSTEM_BASIC_INFORMATION structure.</summary>
Private Const SYSTEM_BASICINFORMATION As Integer = 0
''' <summary>Returns an opaque SYSTEM_PERFORMANCE_INFORMATION structure.</summary>
Private Const SYSTEM_PERFORMANCEINFORMATION As Integer = 2
''' <summary>Returns an opaque SYSTEM_TIMEOFDAY_INFORMATION structure.</summary>
Private Const SYSTEM_TIMEINFORMATION As Integer = 3
''' <summary>The value returned by NtQuerySystemInformation is no error occurred.</summary>
Private Const NO_ERROR As Integer = 0
''' <summary>Holds the old idle time.</summary>
Private _oldIdleTime As Long
''' <summary>Holds the old system time.</summary>
Private _oldSystemTime As Long
''' <summary>Holds the number of processors in the system.</summary>
Private _processorCount As Double
End Class
CpuUsageNt


1 Private NotInheritable Class MemUsage
2 <StructLayout(LayoutKind.Sequential)>
3 Private Structure MEMORY_INFO
4 ''' <summary>
5 ''' 当前结构体大小
6 ''' </summary>
7 Public dwLength As UInteger
8 ''' <summary>
9 ''' 当前内存使用率
10 ''' </summary>
11 Public dwMemoryLoad As UInteger
12 ''' <summary>
13 ''' 总计物理内存大小
14 ''' </summary>
15 Public dwTotalPhys As UInteger
16 ''' <summary>
17 ''' 可用物理内存大小
18 ''' </summary>
19 Public dwAvailPhys As UInteger
20 ''' <summary>
21 ''' 总计交换文件大小
22 ''' </summary>
23 Public dwTotalPageFile As UInteger
24 ''' <summary>
25 ''' 可用交换文件大小
26 ''' </summary>
27 Public dwAvailPageFile As UInteger
28 ''' <summary>
29 ''' 总计虚拟内存大小
30 ''' </summary>
31 Public dwTotalVirtual As UInteger
32 ''' <summary>
33 ''' 可用虚拟内存大小
34 ''' </summary>
35 Public dwAvailVirtual As UInteger
36 End Structure
37 <DllImport("kernel32")>
38 Private Shared Sub GlobalMemoryStatus(ByRef meminfo As MEMORY_INFO)
39 End Sub
40
41 Public Function Query() As Int32
42 Dim iRet As Int32 = 0
43 Try
44 Dim MemInfo As New MEMORY_INFO
45 GlobalMemoryStatus(MemInfo)
46 iRet = CInt(MemInfo.dwMemoryLoad)
47 Debug.Print("[DEBUG] GlobalMemoryStatus dwMemoryLoad={0}", iRet)
48 Catch ex As Exception
49 Debug.Print("[WARN ] GlobalMemoryStatus Err:{0}", ex.Message)
50 End Try
51 Return iRet
52 End Function
53
54 ''' <summary>
55 ''' 格式化容量大小
56 ''' </summary>
57 ''' <param name="size">容量(B)</param>
58 ''' <returns>已格式化的容量</returns>
59 Private Shared Function FormatSize(ByVal size As Double) As String
60 Dim d As Double = size
61 Dim i As Integer = 0
62 Do While (d > 1024) AndAlso (i < 5)
63 d /= 1024
64 i += 1
65 Loop
66 Dim unit() As String = {"B", "KB", "MB", "GB", "TB"}
67 Return (String.Format("{0} {1}", Math.Round(d, 2), unit(i)))
68 End Function
69 End Class
MemUsage
参考资料
VB.NET 在 Windows下通过WIn32API获取CPU和内存的使用率的更多相关文章
- Linux下使用java获取cpu、内存使用率
原文地址:http://www.voidcn.com/article/p-yehrvmep-uo.html 思路如下:Linux系统中可以用top命令查看进程使用CPU和内存情况,通过Runtime类 ...
- 方法:Linux 下用JAVA获取CPU、内存、磁盘的系统资源信息
CPU使用率: InputStream is = null; InputStreamReader isr = null; BufferedReader brStat = null; StringTok ...
- 获取CPU和内存的使用率
1.获取CPU的使用率 主要就是一个计算. int CUseRate::GetCPUUseRate() //获取CPU使用率 { ; FILETIME ftIdle, ftKernel, ftUser ...
- Linux下查看内核、CPU、内存及各组件版本的命令和方法
Linux下查看内核.CPU.内存及各组件版本的命令和方法 Linux查看内核版本: uname -a more /etc/*release ...
- C# 使用 PerformanceCounter 获取 CPU 和 硬盘的使用率
C# 使用 PerformanceCounter 获取 CPU 和 硬盘的使用率: 先看界面: 建一个 Windows Form 桌面程序,代码如下: using System; using Sys ...
- Golang获取CPU、内存、硬盘使用率
Golang获取CPU.内存.硬盘使用率 工具包 go get github.com/shirou/gopsutil 实现 func GetCpuPercent() float64 { percent ...
- Android获取cpu和内存信息、网址的代码
android获取手机cpu并判断是单核还是多核 /** * Gets the number of cores available in this device, across all proce ...
- Python获取CPU、内存使用率以及网络使用状态代码
Python获取CPU.内存使用率以及网络使用状态代码_python_脚本之家 http://www.jb51.net/article/134714.htm
- Linux下java获取CPU、内存、磁盘IO、网络带宽使用率
一.CPU 使用proc文件系统,"proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系统内核数据的操作提供接口.用户和应用程序可以通过proc得 ...
- windows下配置tomcat服务器的jvm内存大小的两种方式
难得遇到一次java堆内存溢出(心里想着,终于可以来一次jvm性能优化了$$) 先看下报错信息, java.lang.OutOfMemoryError: GC overhead limit excee ...
随机推荐
- scratch源码下载 | 几何冲刺
程序说明: <几何冲刺>是一款基于Scratch平台开发的跑酷类游戏程序.在这个游戏中,玩家控制一个黄色的小方块,在快速向前冲刺的过程中躲避各种障碍物.通过按下键盘上的上方向键,玩家可以操 ...
- pytest数据驱动(最简单)
pytest数据驱动(最简单) 第一种:通过yaml文件获取数据(一维列表) data.yaml文件内容如下: - '软件测试'- '单元测试'- '自动化测试'- '性能测试'- '测试开发'- ' ...
- 中国特供阉割版4090D建议安装最新驱动,据说不然的话会报error:4090和4090D对比
资料来源: https://www.bilibili.com/video/BV1oa4y127fG/?spm_id_from=333.999.0.0&vd_source=f1d0f27367a ...
- python库 —— gym retro 的 ROMs文件下载地址
如题: python库 -- gym retro 的 ROMs文件下载地址: https://archive.org/details/No-Intro-Collection_2016-01-03_Fi ...
- 快速基于 ClickHouse + Grafana 搭建可观测性解决方案 - 日志篇(ClickHouse 官方博客)
引言 作为一款高性能的 OLAP 数据库,ClickHouse 被用于多种应用场景,包括 时间序列(time series)数据的实时分析.其多样化的应用场景推动了大量分析函数的发展,这些函数有助于查 ...
- Sentry For Vue 完整接入详解(2021 Sentry v21.8.x)前方高能预警!三万字,慎入!
内容源于:https://docs.sentry.io/platforms/javascript/guides/vue/ 系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创 ...
- Jenkins配置分布式构建环境——添加固定Agent并使用JNLP启动Agent详解
1.概述 在<Jenkins部署架构概述>这篇博文中对Jenkins部署架构进行了讲解.对于分布式架构,Jenkins包括固态Agent和动态Agent两种方案. 固定Agent(常用于虚 ...
- CentOS 7.3离线安装 JDK
1.下载对应的JDK版本 # 网盘链接:https://pan.baidu.com/s/1HMCJis-FEicIcDTgbksBnQ # 密码:q65m 2.查看原系统jdk版本 [bw@local ...
- mariadb5.5.56二进制离线安装
在生产环境中一般使用发布好的二进制版本,简单概括一下安装过程: 1. 下载 地址为:https://downloads.mariadb.org/mariadb/5.5.56/ 这里选择最新版本的5.5 ...
- 全网最适合入门的面向对象编程教程:37 Python常用复合数据类型-列表和列表推导式
全网最适合入门的面向对象编程教程:37 Python 常用复合数据类型-列表和列表推导式 摘要: 在 Python 中,列表是一个非常灵活且常用的复合数据类型.它允许存储多个项,这些项可以是任意的数据 ...