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;

}

运行结果

                        

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Android 中,可以通过读取 `/proc/stat` 文件获取 CPU 使用情况。以下是一个示例代码,可以读取并计算 CPU 占用率: ```java public class CpuUsageMonitor { private static final String TAG = "CpuUsageMonitor"; private static final int UPDATE_INTERVAL = 1000; // 更新间隔,单位为毫秒 private long mLastCpuTime = 0; private long mLastIdleTime = 0; public void start() { new Thread(new Runnable() { @Override public void run() { while (!Thread.interrupted()) { try { Thread.sleep(UPDATE_INTERVAL); } catch (InterruptedException e) { break; } updateCpuUsage(); } } }).start(); } private void updateCpuUsage() { try { RandomAccessFile reader = new RandomAccessFile("/proc/stat", "r"); String line = reader.readLine(); String[] fields = line.split("\\s+"); long userTime = Long.parseLong(fields[1]); long niceTime = Long.parseLong(fields[2]); long systemTime = Long.parseLong(fields[3]); long idleTime = Long.parseLong(fields[4]); long ioWaitTime = Long.parseLong(fields[5]); long irqTime = Long.parseLong(fields[6]); long softIrqTime = Long.parseLong(fields[7]); long totalTime = userTime + niceTime + systemTime + idleTime + ioWaitTime + irqTime + softIrqTime; long idleDuration = idleTime - mLastIdleTime; long totalDuration = totalTime - mLastCpuTime; float cpuUsage = (float) (totalDuration - idleDuration) / totalDuration; Log.d(TAG, "CPU usage: " + cpuUsage); mLastCpuTime = totalTime; mLastIdleTime = idleTime; reader.close(); } catch (IOException e) { Log.e(TAG, "Failed to read /proc/stat", e); } } } ``` 在 `updateCpuUsage()` 方法中,先读取 `/proc/stat` 文件,然后解析出各个 CPU 时间统计项的值。然后计算自上次读取以来 CPU 总时间和空闲时间的增量,根据这个增量计算出 CPU 占用率。最后更新 `mLastCpuTime` 和 `mLastIdleTime` 的值,以备下次计算使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值