C/C++获取Windows系统CPU和内存及硬盘使用情况

简介: //1.获取Windows系统内存使用率   [cpp] view plain copy   //windows 内存 使用率   DWORD getWin_MemUsage(){       MEMORYSTATUS ms;       ::GlobalMemoryStatus(&ms);       return ms.

//1.获取Windows系统内存使用率

 

[cpp]  view plain  copy
 
  1. //windows 内存 使用率  
  2. DWORD getWin_MemUsage(){  
  3.     MEMORYSTATUS ms;  
  4.     ::GlobalMemoryStatus(&ms);  
  5.     return ms.dwMemoryLoad;  
  6. }  

 

 

//2.获取windowsCPU使用率

 

[cpp]  view plain  copy
 
  1. __int64 CompareFileTime(FILETIME time1, FILETIME time2)  
  2. {  
  3.     __int64 a = time1.dwHighDateTime << 32 | time1.dwLowDateTime;  
  4.     __int64 b = time2.dwHighDateTime << 32 | time2.dwLowDateTime;  
  5.   
  6.     return (b - a);  
  7. }  
  8. //WIN CPU使用情况  
  9. void getWin_CpuUsage(){  
  10.     HANDLE hEvent;  
  11.     BOOL res;  
  12.     FILETIME preidleTime;  
  13.     FILETIME prekernelTime;  
  14.     FILETIME preuserTime;  
  15.     FILETIME idleTime;  
  16.     FILETIME kernelTime;  
  17.     FILETIME userTime;  
  18.   
  19.     res = GetSystemTimes(&idleTime, &kernelTime, &userTime);  
  20.     preidleTime = idleTime;  
  21.     prekernelTime = kernelTime;  
  22.     preuserTime = userTime;  
  23.   
  24.     hEvent = CreateEventA(NULL, FALSE, FALSE, NULL); // 初始值为 nonsignaled ,并且每次触发后自动设置为nonsignaled  
  25.   
  26.     while (true){  
  27.         WaitForSingleObject(hEvent, 1000);  
  28.         res = GetSystemTimes(&idleTime, &kernelTime, &userTime);  
  29.   
  30.         __int64 idle = CompareFileTime(preidleTime, idleTime);  
  31.         __int64 kernel = CompareFileTime(prekernelTime, kernelTime);  
  32.         __int64 user = CompareFileTime(preuserTime, userTime);  
  33.   
  34.         __int64 cpu = (kernel + user - idle) * 100 / (kernel + user);  
  35.         __int64 cpuidle = (idle)* 100 / (kernel + user);  
  36.         cout << "CPU利用率:" << cpu << "%" << " CPU空闲率:" << cpuidle << "%" << endl;  
  37.   
  38.         preidleTime = idleTime;  
  39.         prekernelTime = kernelTime;  
  40.         preuserTime = userTime;  
  41.     }  
  42. }  
[cpp]  view plain  copy
 
  1. //获取 WIN 硬盘使用情况  
  2. int getWin_DiskUsage(){  
  3.     int DiskCount = 0;  
  4.     DWORD DiskInfo = GetLogicalDrives();  
  5.     //利用GetLogicalDrives()函数可以获取系统中逻辑驱动器的数量,函数返回的是一个32位无符号整型数据。    
  6.     while (DiskInfo)//通过循环操作查看每一位数据是否为1,如果为1则磁盘为真,如果为0则磁盘不存在。    
  7.     {  
  8.         if (DiskInfo & 1)//通过位运算的逻辑与操作,判断是否为1    
  9.         {  
  10.             ++DiskCount;  
  11.         }  
  12.         DiskInfo = DiskInfo >> 1;//通过位运算的右移操作保证每循环一次所检查的位置向右移动一位。    
  13.         //DiskInfo = DiskInfo/2;    
  14.     }  
  15.     cout << "Logical Disk Number:" << DiskCount << endl;  
  16.     //-----------------------------------------------------------------------------------------  
  17.     int DSLength = GetLogicalDriveStrings(0, NULL);  
  18.     //通过GetLogicalDriveStrings()函数获取所有驱动器字符串信息长度。    
  19.     char* DStr = new char[DSLength];//用获取的长度在堆区创建一个c风格的字符串数组    
  20.     GetLogicalDriveStrings(DSLength, (LPTSTR)DStr);  
  21.     //通过GetLogicalDriveStrings将字符串信息复制到堆区数组中,其中保存了所有驱动器的信息。    
  22.   
  23.     int DType;  
  24.     int si = 0;  
  25.     BOOL fResult;  
  26.     unsigned _int64 i64FreeBytesToCaller;  
  27.     unsigned _int64 i64TotalBytes;  
  28.     unsigned _int64 i64FreeBytes;  
  29.   
  30.     for (int i = 0; i<DSLength / 4; ++i)//为了显示每个驱动器的状态,则通过循环输出实现,由于DStr内部保存的数据是A:\NULLB:\NULLC:\NULL,这样的信息,所以DSLength/4可以获得具体大循环范围    
  31.     {  
  32.         char dir[3] = { DStr[si], ':', '\\' };  
  33.         cout << dir;  
  34.         DType = GetDriveType(DStr + i * 4);  
  35.         //GetDriveType函数,可以获取驱动器类型,参数为驱动器的根目录    
  36.         if (DType == DRIVE_FIXED)  
  37.         {  
  38.             cout << "Hard Disk";  
  39.         }  
  40.         else if (DType == DRIVE_CDROM)  
  41.         {  
  42.             cout << "CD-ROM";  
  43.         }  
  44.         else if (DType == DRIVE_REMOVABLE)  
  45.         {  
  46.             cout << "Removable Disk";  
  47.         }  
  48.         else if (DType == DRIVE_REMOTE)  
  49.         {  
  50.             cout << "Network Disk";  
  51.         }  
  52.         else if (DType == DRIVE_RAMDISK)  
  53.         {  
  54.             cout << "Virtual RAM Disk";  
  55.         }  
  56.         else if (DType == DRIVE_UNKNOWN)  
  57.         {  
  58.             cout << "Unknown Device";  
  59.         }  
  60.   
  61.         fResult = GetDiskFreeSpaceEx(  
  62.             dir,  
  63.             (PULARGE_INTEGER)&i64FreeBytesToCaller,  
  64.             (PULARGE_INTEGER)&i64TotalBytes,  
  65.             (PULARGE_INTEGER)&i64FreeBytes);  
  66.         //GetDiskFreeSpaceEx函数,可以获取驱动器磁盘的空间状态,函数返回的是个BOOL类型数据    
  67.         if (fResult)//通过返回的BOOL数据判断驱动器是否在工作状态    
  68.         {  
  69.             cout << " totalspace:" << (float)i64TotalBytes / 1024 / 1024 << " MB";//磁盘总容量    
  70.             cout << " freespace:" << (float)i64FreeBytesToCaller / 1024 / 1024 << " MB";//磁盘剩余空间    
  71.         }  
  72.         else  
  73.         {  
  74.             cout << " 设备未准备好";  
  75.         }  
  76.         cout << endl;  
  77.         si += 4;  
  78.     }  
  79.     return 0;  
  80. }  

 

//main函数

 

[cpp]  view plain  copy
 
    1. int main( int argc, char **argv )  
    2. {  
    3.     //+++======================获取windows 内存使用率==================+++//  
    4.     DWORD dwValue = getWin_MemUsage();  
    5.     printf("内存使用率为 %d %% \n",dwValue);  
    6.     //+++======================获取Windows CPU使用率====================+++//  
    7.     //getWin_CpuUsage();  
    8.     //+++======================获取Windows 硬盘使用====================+++//  
    9.     getWin_DiskUsage();  
    10.         return 0;  
    11. }  
目录
相关文章
|
1月前
|
安全 Windows
【Azure Cloud Service】在Windows系统中抓取网络包 ( 不需要另外安全抓包工具)
通常,在生产环境中,为了保证系统环境的安全和纯粹,是不建议安装其它软件或排查工具(如果可以安装,也是需要走审批流程)。 本文将介绍一种,不用安装Wireshark / tcpdump 等工具,使用Windows系统自带的 netsh trace 命令来获取网络包的步骤
71 32
|
1月前
|
存储 负载均衡 Java
如何配置Windows主机MPIO多路径访问存储系统
Windows主机多路径(MPIO)是一种技术,用于在客户端计算机上配置多个路径到存储设备,以提高数据访问的可靠性和性能。本文以Windows2012 R2版本为例介绍如何在客户端主机和存储系统配置多路径访问。
98 13
如何配置Windows主机MPIO多路径访问存储系统
|
2月前
|
Windows
.NET 隐藏/自定义windows系统光标
【10月更文挑战第20天】在.NET中,可以使用`Cursor`类来控制光标。要隐藏光标,可将光标设置为`Cursors.None`。此外,还可以通过从文件或资源加载自定义光标来更改光标的样式。例如,在表单加载时设置`this.Cursor = Cursors.None`隐藏光标,或使用`Cursor.FromFile`方法加载自定义光标文件,也可以将光标文件添加到项目资源中并通过资源管理器加载。这些方法适用于整个表单或特定控件。
|
2月前
|
Apache 数据中心 Windows
将网站迁移到阿里云Windows系统云服务器,访问该站点提示连接被拒绝,如何处理?
将网站迁移到阿里云Windows系统云服务器,访问该站点提示连接被拒绝,如何处理?
|
2月前
|
域名解析 缓存 网络协议
Windows系统云服务器自定义域名解析导致网站无法访问怎么解决?
Windows系统云服务器自定义域名解析导致网站无法访问怎么解决?
|
1月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
280 1
|
21天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
1月前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
1月前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
22 3
|
1月前
|
存储 缓存 监控
Elasticsearch集群JVM调优堆外内存
Elasticsearch集群JVM调优堆外内存
49 1