C++ 获取CPU使用率、内存使用率、磁盘空间等
2017-02-28 15:32
716 查看
CPUMemDiskStatus.h
.cpp
#ifndef __CPUMemDiskStatus_h__ #define __CPUMemDiskStatus_h__ //每个磁盘的状态 typedef struct tagDISKSTATUS { DWORD _FreeAvalidToCaller; //用于容纳调用者可用的字节数量 BYTE DWORD _TotalNummber; //用于容纳磁盘上的总字节数 BYTE DWORD _TotalNummberOfFree; //用于容纳磁盘上可用的字节数 BYTE }DISKSTATUS, *LPDISKSTATUS; //所有磁盘的状态 typedef struct tagAllDISKSTATUS { UINT _DiskCount; //磁盘数量 DWORD _Total; //所有磁盘总容量MB DWORD _OfFree; //所有磁盘剩余容量MB }AllDISKSTATUS, *LPAllDISKSTATUS; #include "pdh.h" class CCPUMemDiskStatus { public: CCPUMemDiskStatus(); ~CCPUMemDiskStatus(); public: void GetSystemDiskStatus(ULONGLONG& AllDiskTotal, ULONGLONG& AllDiskFree); void GetSystemCurrentDiskStatus(ULONGLONG& TatolMB, ULONGLONG& FreeCaller); double GetSystemCurrentDiskUsage(); void SystemCpuInit(); //系统CPU使用率 设置检测开始点 void SystemCpuUnInit(); //系统CPU使用率 double GetSystemCpuCurrentUsage(); //系统CPU使用率 检测结束点 BOOL GetPhysicalMemoryState(ULONGLONG& totalPhysMem, ULONGLONG& physMemUsed); double GetTotalPhysicalMemory(); double GetTotalPhysicalMemoryUsed(); double GetPhysicalMemoryUsage(); float TransPercentToFloatValue(const double dValue); private: PDH_HQUERY m_CpuQuery; PDH_HCOUNTER m_CpuTotal; }; #endif
.cpp
#include "stdafx.h" #include "CPUMemDiskStatus.h" #include <Shlwapi.h> #include <windows.h> #include <string> using namespace std; #pragma comment(lib, "Pdh.lib") #pragma comment(lib, "Shlwapi.lib") CCPUMemDiskStatus::CCPUMemDiskStatus() { m_CpuQuery = NULL; m_CpuTotal = NULL; } CCPUMemDiskStatus::~CCPUMemDiskStatus() { if (m_CpuTotal){ PdhRemoveCounter(m_CpuTotal); m_CpuTotal = NULL; } if(m_CpuQuery){ PdhCloseQuery(m_CpuQuery); m_CpuQuery = NULL; } SystemCpuUnInit(); } // 获取系统所有硬盘使用情况 void CCPUMemDiskStatus::GetSystemDiskStatus(ULONGLONG& AllDiskTotal, ULONGLONG& AllDiskFree) { int DType = 0; int si = 0; BOOL bResult = FALSE; int DiskCount = 0; ULONGLONG nTempTotal = 0; ULONGLONG nTempFree = 0; ULONGLONG i64FreeBytesToCaller; ULONGLONG i64TotalBytes; ULONGLONG i64FreeBytes; //枚举磁盘数量 DWORD DiskInfo = GetLogicalDrives(); while (DiskInfo){ if (DiskInfo & 1){ ++DiskCount; } DiskInfo = DiskInfo >> 1; } int test = DiskCount; int DSLength = GetLogicalDriveStrings(0, NULL); TCHAR* DStr = NULL; while (!DStr){ DStr = new TCHAR[DSLength]; } if (NULL == DStr){ return; } int nRet = GetLogicalDriveStrings(DSLength, (LPTSTR)DStr); //枚举磁盘名称 for (int i = 0;i < DSLength / 4; i++){ TCHAR strDisk[3] = {0}; _stprintf(strDisk, _T("%c:"), DStr[si]); DType = GetDriveType(DStr + i * 4); bResult = GetDiskFreeSpaceEx( strDisk, (PULARGE_INTEGER)&i64FreeBytesToCaller, (PULARGE_INTEGER)&i64TotalBytes, (PULARGE_INTEGER)&i64FreeBytes); if (bResult){ nTempTotal += (ULONGLONG)i64TotalBytes / 1024 / 1024 / 1024; nTempFree += (ULONGLONG)i64FreeBytesToCaller / 1024 / 1024 / 1024; } else{ OutputDebugString(_T("设备未准备...")); } si += 4; } AllDiskTotal = nTempTotal; AllDiskFree = nTempFree; delete[] DStr; } //获取系统当前磁盘状态 void CCPUMemDiskStatus::GetSystemCurrentDiskStatus(ULONGLONG& TatolMB, ULONGLONG& FreeCaller) { BOOL bResult = FALSE; ULONGLONG nTempTotal = 0; ULONGLONG nTempFree = 0; ULONGLONG ui64FreeBytesToCaller; ULONGLONG ui64TotalBytes; ULONGLONG ui64FreeBytes; TCHAR szModule[MAX_PATH*2] = {0}; GetModuleFileName(NULL, szModule, MAX_PATH*2); #ifdef _UNICODE wstring strPath(szModule); wstring strDirve = strPath.substr(0, 1); #else string strPath(szModule); string strDirve = strPath.substr(0, 1); #endif TCHAR szDisk[3] = {0}; _stprintf(szDisk, _T("%c:"), strDirve[0]); bResult = GetDiskFreeSpaceEx( szDisk, (PULARGE_INTEGER)&ui64FreeBytesToCaller, //用户可用的磁盘空间 (PULARGE_INTEGER)&ui64TotalBytes, //磁盘总共的空间 (PULARGE_INTEGER)&ui64FreeBytes); //磁盘空闲的空间.以上都是字节为单位。 if (bResult){ nTempTotal = ui64TotalBytes / 1024 / 1024 / 1024; nTempFree = ui64FreeBytesToCaller / 1024 / 1024 / 1024; TatolMB = nTempTotal; FreeCaller = nTempFree; } } //获取系统当前磁盘使用率 double CCPUMemDiskStatus::GetSystemCurrentDiskUsage() { BOOL bResult = FALSE; ULONGLONG ui64FreeBytesToCaller; ULONGLONG ui64TotalBytes; ULONGLONG ui64FreeBytes; TCHAR szModule[MAX_PATH*2] = {0}; GetModuleFileName(NULL, szModule, MAX_PATH*2); ::PathRemoveFileSpec(szModule); #ifdef _UNICODE wstring strPath(szModule); wstring strDirve = strPath.substr(0, 1); #else string strPath(szModule); string strDirve = strPath.substr(0, 1); #endif TCHAR szDisk[3] = {0}; _stprintf(szDisk, _T("%c:"), strDirve[0]); bResult = GetDiskFreeSpaceEx( szDisk, (PULARGE_INTEGER)&ui64FreeBytesToCaller, //用户可用的磁盘空间 (PULARGE_INTEGER)&ui64TotalBytes, //磁盘总共的空间 (PULARGE_INTEGER)&ui64FreeBytes); //磁盘空闲的空间.以上都是字节为单位。 if (bResult){ double TempNum = ((ui64TotalBytes / 1024 / 1024 / 1024)-(ui64FreeBytesToCaller/ 1024 / 1024 / 1024))* 100.0 / (ui64TotalBytes/ 1024 / 1024 / 1024); return TempNum; } return 0; } //初始化CPU void CCPUMemDiskStatus::SystemCpuInit() { PDH_STATUS state; state = PdhOpenQuery(NULL, NULL, &m_CpuQuery); state = PdhAddCounter(m_CpuQuery, _T("\\Processor(_Total)\\% Processor Time"), NULL, &m_CpuTotal); state = PdhCollectQueryData(m_CpuQuery); } //获取CPU使用值 double CCPUMemDiskStatus::GetSystemCpuCurrentUsage() { PDH_FMT_COUNTERVALUE counterVal; PdhCollectQueryData(m_CpuQuery); PDH_STATUS state = PdhGetFormattedCounterValue(m_CpuTotal, PDH_FMT_DOUBLE, NULL, &counterVal); return counterVal.doubleValue;//PDH_INVALID_ARGUMENT PDH_INVALID_DATA } //反初始化CPU void CCPUMemDiskStatus::SystemCpuUnInit() { if (m_CpuTotal){ PdhRemoveCounter(m_CpuTotal); m_CpuTotal = NULL; } if(m_CpuQuery){ PdhCloseQuery(m_CpuQuery); m_CpuQuery = NULL; } } //物理内存和使用 BOOL CCPUMemDiskStatus::GetPhysicalMemoryState(ULONGLONG& totalPhysMem, ULONGLONG& physMemUsed) { MEMORYSTATUSEX memInfo; memInfo.dwLength = sizeof(MEMORYSTATUSEX); GlobalMemoryStatusEx(&memInfo); totalPhysMem = memInfo.ullTotalPhys; physMemUsed = memInfo.ullTotalPhys - memInfo.ullAvailPhys; return TRUE; } //机器物理内存容量 double CCPUMemDiskStatus::GetTotalPhysicalMemory() { MEMORYSTATUSEX memInfo; memInfo.dwLength = sizeof(MEMORYSTATUSEX); GlobalMemoryStatusEx(&memInfo); double totalPhysMem = ((memInfo.ullTotalPhys / 1024 / 1024) * 100)/ 1024; double fTemptotal = totalPhysMem / 100.0; return fTemptotal; } //机器物理内存使用 double CCPUMemDiskStatus::GetTotalPhysicalMemoryUsed() { MEMORYSTATUSEX memInfo; memInfo.dwLength = sizeof(MEMORYSTATUSEX); GlobalMemoryStatusEx(&memInfo); double physMemUsed = (((memInfo.ullTotalPhys - memInfo.ullAvailPhys) / 1024 / 1024) * 100) / 1024;; double fTemMemUsed = physMemUsed / 100.0; return fTemMemUsed; } // 机器物理内存使用率 double CCPUMemDiskStatus::GetPhysicalMemoryUsage() { MEMORYSTATUSEX memInfo; memInfo.dwLength = sizeof(MEMORYSTATUSEX); GlobalMemoryStatusEx(&memInfo); double MemUsage = memInfo.dwMemoryLoad; return MemUsage; } //使用率百分数转换浮点数 float CCPUMemDiskStatus::TransPercentToFloatValue(const double dValue) { float fResult = 0.00; if (dValue == 0){ return fResult; } double dTemp = dValue * 10; int iTemp = (int)dValue; float fCmp = dTemp - iTemp; fCmp = fCmp * 10; iTemp = iTemp + (int)fCmp / 10.0; fResult = iTemp / 1000.0; return fResult; }
double dCpuUsage = m_CpuMemDiskStatus.GetSystemCpuCurrentUsage(); float fCpuUsage = m_CpuMemDiskStatus.TransPercentToFloatValue(dCpuUsage); //m_CpuMemDiskStatus.SystemCpuUnInit(); float fMemSize = m_CpuMemDiskStatus.GetTotalPhysicalMemory(); float fMemUsage = m_CpuMemDiskStatus.TransPercentToFloatValue(m_CpuMemDiskStatus.GetPhysicalMemoryUsage()); ULONGLONG ulCurDiskSize = 0,ulCurDiskFree = 0; m_CpuMemDiskStatus.GetSystemCurrentDiskStatus(ulCurDiskSize, ulCurDiskFree); float fCurDiskUsage = m_CpuMemDiskStatus.TransPercentToFloatValue(m_CpuMemDiskStatus.GetSystemCurrentDiskUsage()); WCHAR cData[MAX_PATH] = {0}; memset(cData, 0x00, sizeof(cData)/sizeof(char)); swprintf(cData, L"%0.2f", fCpuUsage); wstring wstrCpuUsage = cData; memset(cData, 0x00, sizeof(cData)/sizeof(char)); swprintf(cData, L"%0.2f", fMemSize); wstring wstrMemSize = cData; memset(cData, 0x00, sizeof(cData)/sizeof(char)); swprintf(cData, L"%0.2f", fMemUsage); wstring wstrMemUsage = cData; memset(cData, 0x00, sizeof(cData)/sizeof(char)); swprintf(cData, L"%d", ulCurDiskSize); wstring wstrDiskSize = cData; memset(cData, 0x00, sizeof(cData)/sizeof(char)); swprintf(cData, L"%0.2f", fCurDiskUsage); wstring wstrDiskUsage = cData;
相关文章推荐
- Linux Java 获取CPU使用率,内存使用率,磁盘IO,网络带宽使用率等等
- Qt linux获取cpu使用率、内存、网络收发速度、磁盘读写速度、磁盘剩余空间等
- 获取CPU,内存使用率,磁盘相关信息
- Linux下java获取CPU、内存、磁盘IO、网络带宽使用率
- linux下获取内存使用率及cpu使用率
- Linux下java获取CPU、内存、磁盘IO、网络带宽使用率
- Python获取CPU使用率、内存使用率、网络使用状态
- 编程获取系统当前cpu使用率/空闲率 、内存使用率、剩余可用内存 Nvidia GPU的利用率等
- 编程实现获取linux服务器cpu、内存和磁盘使用率
- 获取Windows操作系统的CPU使用率以及内存使用率
- Linux下java获取CPU、内存、磁盘IO、网络带宽使用率
- 编程获取系统当前cpu使用率/空闲率 、内存使用率、剩余可用内存等
- 获取系统的CPU使用率、内存使用率
- Linux下,java获取CPU使用率、内存使用率
- java获取cpu使用率/内存使用率/硬盘的使用率
- Linux下java获取CPU、内存、磁盘IO、网络带宽使用率
- c++获取磁盘空间
- Python获取CPU使用率、内存使用率、网络使用状态
- Linux下java获取CPU、内存、磁盘IO、网络带宽使用率
- Linux下,java获取CPU使用率、内存使用率