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 ...
随机推荐
- Codeforces Round 947 (Div. 1 + Div. 2) A~H
Codeforces Round 947 (Div. 1 + Div. 2) A 模拟. B 最小的 \(a\) 肯定作为 \(i\).对于不被 \(i\) 整除的,最小的那个作为 \(j\),判断是 ...
- 【Vue2】Vue-Cli使用
1.需要NodeJS环境支持,此处省略NodeJS安装 2.使用NPM命令安装CLI包 vue-cli是npm.上的一个全局包,使用npm install 命令,即可方便的把它安装到自己的电脑上: n ...
- 【Dubbo】构建SpringBoot整合Dubbo的Demo
参考乐字节的Dubbo教程 https://www.bilibili.com/video/BV19L4y1n7YE Zookeeper单机部署 (Windows) 因为项目需要,这里我自己学习就采用Z ...
- 【Web】 抓包工具Charles
官方软件包下载 https://www.charlesproxy.com/download/ 在线生成激活码: https://www.zzzmode.com/mytools/charles/ 代理设 ...
- 【SpringMVC】11 拦截器
拦截器是AOP具体的应用 只能使用SpringMVC自己的组件有效 之拦截访问控制器方法的请求, 如果访问的是jsp.html.css.img.js这一类的静态资源,则不会拦截 演示: 编写一个拦截器 ...
- Google的蛋白质结构预测项目代码(Demo)
相关: Artificial Intelligence | 60 Minutes Full Episodes
- 树莓派3B+ 安装开源软路由 openwrt 并设置 无线网桥
在openwrt官网上找到最新版的下载地址: https://openwrt.org/releases/19.07/start 注: 本文中使用的openwrt 系统为最新的稳定版系统,自带web ...
- ( Ubuntu环境下 )Vim插件推荐-Python自动补齐Vim插件jedi-vim的安装(使用插件管理器vundle进行安装)
Ubuntu系统下,为 Vim 安装python自动补齐的插件 jedi-vim . 1. jedi-vim安装依赖 首先,jedi-vim插件需要当前Vim版本支持python,在终端输 ...
- 使用UltraISO克隆clone树莓派SD卡(注意不是复制、备份,是克隆)
搞了好长时间做了一个树莓派的SD卡,包括了一些自己安装的配置,为了防止哪天把这个SD卡搞坏掉(比如写数据时候断电,比如apt upgrade时掉电),于是考虑把这个SD卡进行克隆clone. 因为手上 ...
- 前端使用 Konva 实现可视化设计器(20)- 性能优化、UI 美化
这一章主要分享一下使用 Konva 遇到的性能优化问题,并且介绍一下 UI 美化的思路. 至少有 2 位小伙伴积极反馈,发现本示例有明显的性能问题,一是内存溢出问题,二是卡顿的问题,在这里感谢大家的提 ...