您的位置:首页 > 编程语言 > C语言/C++

C++ 获取CPU使用率、内存使用率、磁盘空间等

2017-02-28 15:32 716 查看
CPUMemDiskStatus.h

#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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: