【问题标题】:C++ CPU usage percentage spikesC++ CPU 使用百分比峰值
【发布时间】:2023-02-07 18:06:32
【问题描述】:

我写了下面的代码来获取窗口机器上的当前 cpu 使用率。但是我注意到一些不寻常的尖峰。我得到的百分比十分之九在 2-5 之间,然后突然飙升到 95% 以上,这与任务管理器显示的内容不一致...有人可以指出是否有任何问题我做错了吗?

#include <iostream>
#include <sstream>
#include <chrono>
#include <thread>
#include <vector>
#include <Windows.h>

float roundPercentage(const double& d) {

    std::ostringstream tmp;

    tmp << d;

    std::string str = tmp.str();

    return (float)(std::round(std::stof(str.substr(0, 5)) * 100) / 100);

}

int main() {

    while (true) {
        FILETIME idle_time, kernel_time, user_time;
        std::vector<FILETIME> last_values;
        GetSystemTimes(&idle_time, &kernel_time, &user_time);
        last_values.push_back(kernel_time);
        last_values.push_back(user_time);

        std::this_thread::sleep_for(std::chrono::milliseconds(500));

        GetSystemTimes(&idle_time, &kernel_time, &user_time);
        unsigned long long current_value = (kernel_time.dwLowDateTime + kernel_time.dwHighDateTime) + (user_time.dwLowDateTime + user_time.dwHighDateTime);
        unsigned long long last_value = (last_values[0].dwLowDateTime + last_values[0].dwHighDateTime) + (last_values[1].dwLowDateTime + last_values[1].dwHighDateTime);

        double d = (double)(last_value - current_value) / (double)(last_value + current_value) * 100.0;

        std::cout << "cpu usage: " << roundPercentage(d) << "%" << std::endl;
        
    }
    
    return 0;
}

【问题讨论】:

标签: c++ windows cpu cpu-usage


【解决方案1】:

基于cmets,我更好地研究了FILETIMEULARGE_INTEGER,下面的代码似乎有效……

#include <iostream>
#include <chrono>
#include <thread>
#include <Windows.h>

uint64_t FromFileTime(const FILETIME& ft) {
    ULARGE_INTEGER uli = { 0 };
    uli.LowPart = ft.dwLowDateTime;
    uli.HighPart = ft.dwHighDateTime;
    return uli.QuadPart;
}

int main() {


    while (true) {
        
        FILETIME idle_time, kernel_time, user_time;
                
        GetSystemTimes(&idle_time, &kernel_time, &user_time);
        
        uint64_t k1 = FromFileTime(kernel_time);
        uint64_t u1 = FromFileTime(user_time);
        uint64_t i1 = FromFileTime(idle_time);

        std::this_thread::sleep_for(std::chrono::milliseconds(500));

        GetSystemTimes(&idle_time, &kernel_time, &user_time);

        uint64_t k2 = FromFileTime(kernel_time);
        uint64_t u2 = FromFileTime(user_time);
        uint64_t i2 = FromFileTime(idle_time);

        
        uint64_t ker = k2 - k1;
        uint64_t usr = u2 - u1;
        uint64_t idl = i2 - i1;

        uint64_t cpu = (ker + usr - idl) * 100 / (ker + usr);

        std::cout << "cpu usage: " << static_cast<int>(cpu) << "%" << std::endl;
        
    }
    

    return 0;
}

【讨论】:

    猜你喜欢
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多