windows環境下讀取CPU和內存使用率

main.cpp

#include "RC.h"
int main() {

	//CPU利用率
	unsigned char cpuUseageInfo[18];
	unsigned char ramUseageInfo[16];
	while (true)
	{
		cpuUseageUchar(cpuUseageInfo, false);
		puts((char*)cpuUseageInfo);
		RAMUseageInfo(ramUseageInfo, false);
		puts((char*)ramUseageInfo);
		Sleep(1000);
	}
	getchar();
}

RC.h

// Resource Consumption
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include <stdio.h>
#include <Windows.h> 
#include <time.h>
#include <tchar.h>

double cpuUseage();
__int64 compareFileTime2(FILETIME time1, FILETIME time2);
double cpuUseageUchar(unsigned char* cpuUseageInfo, bool isPrintf);
long RAMUseageInfo(unsigned char* RAMInfo, bool isPrintf);

RC.cpp

#include "RC.h"

//CPU利用率  
FILETIME m_preidleTime;
FILETIME m_prekernelTime;
FILETIME m_preuserTime;

__int64 compareFileTime2(FILETIME time1, FILETIME time2)
{
	__int64 a = time1.dwHighDateTime << 32 | time1.dwLowDateTime;
	__int64 b = time2.dwHighDateTime << 32 | time2.dwLowDateTime;


	return   b - a;
}

double cpuUseage()
{
	FILETIME idleTime;
	FILETIME kernelTime;
	FILETIME userTime;
	GetSystemTimes(&idleTime, &kernelTime, &userTime);


	int idle = compareFileTime2(m_preidleTime, idleTime);
	int kernel = compareFileTime2(m_prekernelTime, kernelTime);
	int user = compareFileTime2(m_preuserTime, userTime);


	if (kernel + user == 0)
		return 0.0;
	//(總的時間-空閒時間)/總的時間=佔用cpu的時間就是使用率  
	double cpu = abs((kernel + user - idle) * 100 / (kernel + user));

	m_preidleTime = idleTime;
	m_prekernelTime = kernelTime;
	m_preuserTime = userTime;
	return cpu;
}

/* the cpuUseageInfo minimal size is 18.
	eg: unsigned char cpuUseageInfo[18]*/
double cpuUseageUchar(unsigned char* cpuUseageInfo,bool isPrintf) {
	//unsigned char sysStateCpu[6];
	double cpu = cpuUseage();
	unsigned char cpuUseage[18];
	sprintf((char*)cpuUseageInfo, "CPU Useage:%.2f%%", cpu);
	if (isPrintf) {
		puts((char*)cpuUseageInfo);
	}
	//printf("%f\n", cpu);
	return cpu;
}

/* the RAMUseageInfo minimal size is 16.
	eg: unsigned char cpuUseageInfo[16] */
long RAMUseageInfo(unsigned char* RAMInfo, bool isPrintf) {
	MEMORYSTATUSEX statex;
	statex.dwLength = sizeof(statex);
	GlobalMemoryStatusEx(&statex);
	sprintf((char*)RAMInfo, "RAM Useage:%ld%%\n", statex.dwMemoryLoad);
	if (isPrintf) {
		puts((char*)RAMInfo);
	}
	//printf("%d\n", statex.dwMemoryLoad);
	return statex.dwMemoryLoad;
}

效果截圖如下:

說明:程序輸出的CPU使用率和windows自帶的資源管理器中的使用率相差4-8個百分點;內存使用率相差不大,大概在3個百分點內。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章