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

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;
    SystemCpuInit();
}

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;

 

 

 

 

 

  • 3
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
C++获取CPU使用率内存使用率,可以使用操作系统提供的API函数来实现。下面是Windows平台下获取CPU使用率内存使用率的示例代码: 获取CPU使用率: ```c++ #include <windows.h> #include <iostream> using namespace std; double getCpuUsage() { FILETIME idleTime, kernelTime, userTime; if (!GetSystemTimes(&idleTime, &kernelTime, &userTime)) { return -1; } static FILETIME prevIdleTime = idleTime; static FILETIME prevKernelTime = kernelTime; static FILETIME prevUserTime = userTime; ULONGLONG idle = CompareFileTime(&idleTime, &prevIdleTime); ULONGLONG kernel = CompareFileTime(&kernelTime, &prevKernelTime); ULONGLONG user = CompareFileTime(&userTime, &prevUserTime); double cpuUsage = (double)(kernel + user - idle) / (kernel + user); prevIdleTime = idleTime; prevKernelTime = kernelTime; prevUserTime = userTime; return cpuUsage * 100; } int main() { while (true) { double cpuUsage = getCpuUsage(); cout << "CPU usage: " << cpuUsage << "%" << endl; Sleep(1000); } return 0; } ``` 获取内存使用率: ```c++ #include <windows.h> #include <iostream> using namespace std; double getMemoryUsage() { MEMORYSTATUSEX memStatus; memStatus.dwLength = sizeof(memStatus); if (!GlobalMemoryStatusEx(&memStatus)) { return -1; } double memoryUsage = 100.0 * (memStatus.ullTotalPhys - memStatus.ullAvailPhys) / memStatus.ullTotalPhys; return memoryUsage; } int main() { while (true) { double memoryUsage = getMemoryUsage(); cout << "Memory usage: " << memoryUsage << "%" << endl; Sleep(1000); } return 0; } ``` 以上示例代码只是提供了一个简单的思路,实际应用中还需要对获取到的数据进行处理和显示。另外,在不同的操作系统上,获取CPU使用率内存使用率的方法可能会有所不同,需要根据具体的操作系统API来实现。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值