gpt4 book ai didi

c++ - GetSystemTimes() 的问题

转载 作者:行者123 更新时间:2023-11-28 00:07:41 25 4
gpt4 key购买 nike

我目前正在研究一种监视工具。它基本上就像任务管理器,我这样做只是因为我想接触 C++ 并学习新东西。

CPU使用部分的核心是GetSystemTimes() .该函数返回指向 3 个值的指针,CPU 处于空闲状态的时间、CPU 处于内核态的时间和 CPU 处于用户态的时间。我两次调用该函数,中间有 250 毫秒的休眠时间,并计算值的差异的百分比。

不过,我有两个问题。该函数返回指向 FILETIME 结构的指针,但我需要整数、 float 、 double 或类似的实际值,因为我需要计算 (int 对我来说足够了,但我不知道有多大值是)。我知道一个指针告诉我数据保存在哪里,但我不知道如何才能真正获得这些数据。我如何才能从 FILETIME 转到其他东西,一旦我得到它。

#include <iostream>
#define _WIN32_WINNT 0x0602
#include <windows.h>
#include <stdlib.h>

class Processor{};

class Usage: public Processor
{
public:

int now()
{
FILETIME a0, a1, a2, b0, b1, b2;

GetSystemTimes(&a0, &a1, &a2);
SleepEx(250, false);
GetSystemTimes(&b0, &b1, &b2);

// attempt to get the actual value instead of the pointer and convert it to float/double/int
float idle0 = a0;
float idle1 = b0;
float kernel0 = a1;
float kernel1 = b1;
float user0 = a2;
float user1 = b2;

float idl = idle1 - idle0;
float ker = kernel0 - kernel1;
float usr = user0 - user1;

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

return cpu;
}
};

int main()
{
using namespace std;

Usage Usage;

for(int i = 0; i < 10; i++)
{
cout << "CPU:\t" << Usage.now() << endl;
}

cout << "\nFinished!\nPress any key to exit!\n";
cin.clear();
cin.get();
return 0;
}

感谢您的帮助! :)

最佳答案

你的问题可以分为两个简单的问题:

  1. FILETIME 对象转换为整数值。
  2. 使用之前推导的整数值计算百分比。

A FILETIME结构...

[c]ontains a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC).

适合存储FILETIME 时间戳的整数类型是uint64_t。 .以下代码执行转换:

#include <cstdint>

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

使用这个实用函数,您可以更改剩余的代码以生成您要查找的百分比:

int now() {
FILETIME a0, a1, a2, b0, b1, b2;

GetSystemTimes(&a0, &a1, &a2);
SleepEx(250, false);
GetSystemTimes(&b0, &b1, &b2);

uint64_t idle0 = FromFileTime( a0 );
uint64_t idle1 = FromFileTime( b0 );
uint64_t kernel0 = FromFileTime( a1 );
uint64_t kernel1 = FromFileTime( b1 );
uint64_t user0 = FromFileTime( a2 );
uint64_t user1 = FromFileTime( b2 );

uint64_t idl = idle1 - idle0;
uint64_t ker = kernel1 - kernel0;
uint64_t usr = user1 - user0;

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

return static_cast<int>( cpu );
}

理论上,乘法和加法(ker + usrker + usr + idl)可以溢出。从技术上讲,应该处理这些错误。然而,实际上,与整数类型可以存储的最大值相比,这些值应该非常小。

关于c++ - GetSystemTimes() 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34592725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com