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个百分点内。