先上代码
#include <Windows.h>
#include <iostream>
int main() {
FILETIME idleTime, kernelTime, userTime;//FILETIME表示时间的结构体,64位值,想知道细节的百度
ULARGE_INTEGER lastIdleTime, lastKernelTime, lastUserTime;
double cpuUsage;
while (true) {
// 获取系统时间信息
if (!GetSystemTimes(&idleTime, &kernelTime, &userTime)) {
std::cerr << "Failed to get system times." << std::endl;
return 1;
}
// 将FILETIME结构转换为ULARGE_INTEGER
memcpy(&lastIdleTime, &idleTime, sizeof(FILETIME));
memcpy(&lastKernelTime, &kernelTime, sizeof(FILETIME));
memcpy(&lastUserTime, &userTime, sizeof(FILETIME));
// 等待一段时间
Sleep(1000); // 1秒
// 再次获取系统时间信息
if (!GetSystemTimes(&idleTime, &kernelTime, &userTime)) {
std::cerr << "Failed to get system times." << std::endl;
return 1;
}
// 计算CPU使用率
ULARGE_INTEGER currentIdleTime, currentKernelTime, currentUserTime;
memcpy(¤tIdleTime, &idleTime, sizeof(FILETIME));
memcpy(¤tKernelTime, &kernelTime, sizeof(FILETIME));
memcpy(¤tUserTime, &userTime, sizeof(FILETIME));
// 计算时间间隔
ULONGLONG idleDelta = currentIdleTime.QuadPart - lastIdleTime.QuadPart;
ULONGLONG kernelDelta = currentKernelTime.QuadPart - lastKernelTime.QuadPart;
ULONGLONG userDelta = currentUserTime.QuadPart - lastUserTime.QuadPart;
ULONGLONG totalDelta = kernelDelta + userDelta;
// 计算CPU使用率
cpuUsage = (1.0 - static_cast<double>(idleDelta) / totalDelta) * 100.0;
std::cout << "CPU Usage: " << cpuUsage << "%" << std::endl;
}
return 0;
}
代码关键:
GetSystemTimes
函数:检索系统计时信息。 在多处理器系统上,返回的值是所有处理器中指定时间的总和。
语法:
BOOL GetSystemTimes(
[out, optional] PFILETIME lpIdleTime,
[out, optional] PFILETIME lpKernelTime,
[out, optional] PFILETIME lpUserTime
);
语法解释:将信息存储进传入的三个参数之中
[out, optional] lpIdleTime
指向 FILETIME 结构的指针,该结构接收系统处于空闲状态的时间量。
[out, optional] lpKernelTime
指向 FILETIME 结构的指针,该结构接收系统在内核模式下执行所花费的时间, (包括所有进程、所有处理器) 上的所有线程。 此时间值还包括系统处于空闲状态的时间量。
[out, optional] lpUserTime
指向 FILETIME 结构的指针,该结构接收系统在用户模式下执行所花费的时间, (包括所有进程、所有处理器) 上的所有线程。