获取内存大小、CPU大小、硬盘大小及使用率


  1 #include <cassert>
  2 #include <iostream>
  3 #include <windows.h>
  4 #include <process.h>
  5 #include <assert.h>
  6 #include <conio.h>
  7 #include <TlHelp32.h>
  8 #include <process.h>
  9 #include <Psapi.h>
 10 #include <time.h>
 11 #include <tchar.h>
 12 
 13 using namespace std;
 14 #pragma comment(lib, "Psapi.Lib")
 15 
 16 double FormatDouble2(double value)
 17 {
 18     return floor(value*100.0 + 0.5) / 100.0;
 19 }
 20 
 21 double FileTimeSub(FILETIME ftEndTime, FILETIME ftStartTime)
 22 {
 23     double nDeltaTime;
 24 
 25     double nEndTime = (unsigned long long)ftEndTime.dwHighDateTime << 32 | ftEndTime.dwLowDateTime;
 26     double nStartTime = (unsigned long long)ftStartTime.dwHighDateTime << 32 | ftStartTime.dwLowDateTime;
 27 
 28     nDeltaTime = nEndTime - nStartTime;
 29 
 30     return nDeltaTime;
 31 }
 32 
 33 /// 获得CPU的核数  
 34 int get_cpu_total()
 35 {
 36     SYSTEM_INFO info;
 37     GetSystemInfo(&info);
 38     return (int)info.dwNumberOfProcessors;
 39 }
 40 
 41 
 42 double get_cpu_usage()
 43 {
 44     FILETIME ftStartIdleTime, ftStartKernelTime, ftStartUserTime;
 45     FILETIME ftEndIdleTime, ftEndKernelTime, ftEndUserTime;
 46 
 47     GetSystemTimes(&ftStartIdleTime, &ftStartKernelTime, &ftStartUserTime);
 48     Sleep(1000);
 49     GetSystemTimes(&ftEndIdleTime, &ftEndKernelTime, &ftEndUserTime);
 50 
 51     double nDeltaIdleTime = FileTimeSub(ftEndIdleTime, ftStartIdleTime);
 52     double nDeltaKernelTime = FileTimeSub(ftEndKernelTime, ftStartKernelTime);
 53     double nDeltaUserTime = FileTimeSub(ftEndUserTime, ftStartUserTime);
 54     if (nDeltaKernelTime + nDeltaUserTime == 0)
 55     {
 56         return 0;
 57     }
 58 
 59     double nCPUUsageRate = ((nDeltaKernelTime + nDeltaUserTime - nDeltaIdleTime) * 100) / (nDeltaKernelTime + nDeltaUserTime);
 60 
 61     return FormatDouble2(nCPUUsageRate);
 62 }
 63 
 64 double get_memory_usage()
 65 {
 66     MEMORYSTATUS ms;
 67     ::GlobalMemoryStatus(&ms);
 68     return ms.dwMemoryLoad;
 69 }
 70 
 71 
 72 double get_memory_total()
 73 {
 74     double nGB = 1024 * 1024 * 1024;
 75     PERFORMANCE_INFORMATION stPerformance = { 0 };
 76     double cb = sizeof(stPerformance);
 77     GetPerformanceInfo(&stPerformance, cb);
 78     double nPageSize = stPerformance.PageSize;
 79     double memtotal = (INT64)stPerformance.PhysicalTotal * nPageSize;
 80 
 81     memtotal = memtotal / nGB;
 82     return FormatDouble2(memtotal);
 83 }
 84 
 85 double get_disk_usage()
 86 {
 87     double all_Total = 0;                 //函数外自定义
 88     double all_Free = 0;
 89     DWORD dwSize = MAX_PATH;
 90     TCHAR szLogicalDrives[MAX_PATH] = { 0 };
 91 
 92 
 93     DWORD dwResult = GetLogicalDriveStrings(dwSize, szLogicalDrives);
 94 
 95 
 96     if (dwResult > 0 && dwResult <= MAX_PATH)
 97     {
 98         TCHAR* szSingleDrive = szLogicalDrives;
 99 
100         while (*szSingleDrive)
101         {
102             uint64_t available, total, free;
103             if (GetDiskFreeSpaceEx(szSingleDrive, (ULARGE_INTEGER*)&available, (ULARGE_INTEGER*)&total, (ULARGE_INTEGER*)&free))
104             {
105                 uint64_t Total, Available, Free;
106                 Total = total >> 20;
107                 Available = available >> 20;
108                 Free = free >> 20;
109 
110                 all_Total += Total;   //总
111                 all_Free += Free;   //剩余
112             }
113 
114             // 获取下一个驱动器号起始地址
115             szSingleDrive += _tcslen(szSingleDrive) + 1;
116         }
117     }
118     double useage = (((all_Total - all_Free) * 100) / all_Total);
119     return FormatDouble2(useage);
120 }
121 
122 
123 double get_disk_total()   //单位:G
124 {
125     double all_Total = 0;                 //函数外自定义
126     double all_Free = 0;
127     DWORD dwSize = MAX_PATH;
128     TCHAR szLogicalDrives[MAX_PATH] = { 0 };
129 
130 
131     DWORD dwResult = GetLogicalDriveStrings(dwSize, szLogicalDrives);
132 
133 
134     if (dwResult > 0 && dwResult <= MAX_PATH)
135     {
136         TCHAR* szSingleDrive = szLogicalDrives;
137 
138         while (*szSingleDrive)
139         {
140             uint64_t available, total, free;
141             if (GetDiskFreeSpaceEx(szSingleDrive, (ULARGE_INTEGER*)&available, (ULARGE_INTEGER*)&total, (ULARGE_INTEGER*)&free))
142             {
143                 uint64_t Total, Available, Free;
144                 Total = total >> 20;
145                 Available = available >> 20;
146                 Free = free >> 20;
147 
148                 all_Total += Total;   //总
149                 all_Free += Free;   //剩余
150             }
151 
152             // 获取下一个驱动器号起始地址
153             szSingleDrive += _tcslen(szSingleDrive) + 1;
154         }
155     }
156     all_Total = all_Total / 1024;
157     return FormatDouble2(all_Total);
158 }
159 
160 
161 int main()
162 {
163 
164     cout <<  "cpu_total: " << get_cpu_total() << endl;
165     cout <<  "cpu_use: " << get_cpu_usage() << endl;
166 
167 
168     cout <<  "memory_total: " << get_memory_total() << endl;
169     cout <<  "memory_used: " << get_memory_usage() << endl;
170     cout <<  "disk_total: " << get_disk_total() << endl;
171     cout <<  "disk_used: " << get_disk_usage() << endl;
172 }
173 
174 
175 

posted on 2020-08-21 15:14  thinkinc999  阅读(360)  评论(0编辑  收藏  举报

导航