GetSystemTimes:获取CPU占用率(WIN API)

原文链接:https://blog.csdn.net/qq_28742901/article/details/104960653

GetSystemTimes函数:

BOOL WINAPI GetSystemTimes(

__out_opt LPFILETIME lpIdleTime, // 空闲时间

__out_opt LPFILETIME lpKernelTime, // 内核进程占用时间

__out_opt LPFILETIME lpUserTime // 用户进程占用时间

);

GetSystemTimes获得系统(自开机以来)处于Kernel状态下面的CPU时间,以及系统处于User状态下的时间,以及Idle的时间;

返回值:

如果函数成功,返回值为true。

如果函数失败,返回值为false。

调用GetLastError函数可获得更多的错误信息。

算法:
使用以下方法获取两个FILETIME的时间差,就可以知道在一段时间内Cup的使用时间

// 获取两个时间间隔整数

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

    __int64 b = time2.dwHighDateTime << 32 | time2.dwLowDateTime;

    return (b - a);
}

完整代码:

#include <stdio.h>
#include <windows.h>
#include <iostream>

using namespace std;

// 获取两个时间间隔整数
__int64 CompareFileTime(FILETIME time1, FILETIME time2)
{
    __int64 a = time1.dwHighDateTime << 32 | time1.dwLowDateTime;
    __int64 b = time2.dwHighDateTime << 32 | time2.dwLowDateTime;
    return (b - a);
}

int main()
{
    HANDLE hEvent;
    BOOL res;
    // 上一秒cup自开机起总的空闲时间
    FILETIME preidleTime;
    // 上一秒cup自开机起总的内核进程占用时间
    FILETIME prekernelTime;
    // 上一秒cup自开机起总的用户进程占用时间
    FILETIME preuserTime;
    // 当前cup自开机起总的空闲时间
    FILETIME idleTime;
    // 当前cup自开机起总的内核进程占用时间
    FILETIME kernelTime;
    // 当前cup自开机起总的用户进程占用时间
    FILETIME userTime;
    // 获取一次cup占用时间,等一秒后再次获取新的时间
    res = GetSystemTimes(&idleTime, &kernelTime, &userTime);
    preidleTime = idleTime;
    prekernelTime = kernelTime;
    preuserTime = userTime;
    // 初始值为 nonsignaled ,并且每次触发后自动设置为nonsignaled
    hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    while (1) {
        // 等待1秒
        WaitForSingleObject(hEvent, 1000); 
        res = GetSystemTimes(&idleTime, &kernelTime, &userTime);
        // 一秒内的cup空闲时间
        int idle = CompareFileTime(preidleTime, idleTime);
        // 一秒内内核进程cup的占用时间
        int kernel = CompareFileTime(prekernelTime, kernelTime);
        // 一秒内用户进程占用cpu的时间
        int user = CompareFileTime(preuserTime, userTime);
        // (总的时间-空闲时间) / 总的时间 = 占用cpu时间的使用率
        float cpu = (kernel + user - idle) *100.0 / (kernel + user);
        float cpuidle = (idle) *100.0 / (kernel + user);
        cout << "CPU利用率:" << cpu << "%" << "CPU空闲率:" << cpuidle << "%" << endl;
        preidleTime = idleTime;
        prekernelTime = kernelTime;
        preuserTime = userTime;
    }
    return 0;

}

运行结果

                        

相关推荐

  1. 解决云服务器CPU占用接近100%问题

    2024-03-31 21:52:06       25 阅读
  2. 获取cpu全局瞬时占用[windows][linux][c++]

    2024-03-31 21:52:06       63 阅读
  3. Oracle数据库服务器CPU占用巨高的问题排查思路

    2024-03-31 21:52:06       34 阅读
  4. ukui-kwin-x11占用cpu 100%

    2024-03-31 21:52:06       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-31 21:52:06       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-31 21:52:06       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-31 21:52:06       87 阅读
  4. Python语言-面向对象

    2024-03-31 21:52:06       96 阅读

热门阅读

  1. 省级-居民消费结构升级数据集(2014-2022年)

    2024-03-31 21:52:06       41 阅读
  2. 循环神经网络之文本预处理

    2024-03-31 21:52:06       34 阅读
  3. 专升本-区块链

    2024-03-31 21:52:06       35 阅读
  4. 【八股】IOC

    2024-03-31 21:52:06       43 阅读
  5. 二分查找中的小细节

    2024-03-31 21:52:06       38 阅读