我想创建一个应用程序,以MHz为单位监视并显示系统处理器中每个核心的频率。我见过其他应用程序这样做,例如Piriform's Speccy,所以我知道它一定是可能的。
我试过在Stack Overflow上搜索解决方案,但我找不到它。 Even this question,这是我能找到的最接近的匹配,它说的是C ++中的反作弊实现,并没有提供实际的解决方案,但有一个重要的要点this article describes:"使用电源管理技术在今天的计算机中变得越来越普遍,RDTSC指令可以不再按预期工作,这是获取高分辨率CPU时序的常用方法。有这样的想法。
我所看到的最接近的是management object has a MaxClockSpeed,但这会回应处理器的速度,而不是处理器的各个内核。
还有CPUID System Information Monitoring Kit,但这是一个开发套件,需要付出我没有的钱。
那么......现在回到手头的问题,如何以编程方式获取核心时钟速度的当前快照?必须有办法。
P.S。通过涡轮增压和其他技术,核心速度是可变的。这就是为什么我想将这些信息作为当前时间快照。出于监控目的,这样的应用程序将有助于最终用户,以便于他们检测他们的系统是否正确配置,正常工作,并允许他们监视他们的系统并查看负载下的性能等等,知道如何获取这些数据也没有坏处。
答案 0 :(得分:0)
试试CallNtPowerInformation
。以下是其他人的example:
#include <NTstatus.h>
#define WIN32_NO_STATUS
#include <windows.h>
#include <Powrprof.h>
#include <iostream>
typedef struct _PROCESSOR_POWER_INFORMATION {
ULONG Number;
ULONG MaxMhz;
ULONG CurrentMhz;
ULONG MhzLimit;
ULONG MaxIdleState;
ULONG CurrentIdleState;
} PROCESSOR_POWER_INFORMATION, *PPROCESSOR_POWER_INFORMATION;
#pragma comment(lib, "Powrprof.lib")
int main()
{
// get the number or processors
SYSTEM_INFO si = {0};
::GetSystemInfo(&si);
// allocate buffer to get info for each processor
const int size = si.dwNumberOfProcessors * sizeof(PROCESSOR_POWER_INFORMATION);
LPBYTE pBuffer = new BYTE[size];
NTSTATUS status = ::CallNtPowerInformation(ProcessorInformation, NULL, 0, pBuffer, size);
if(STATUS_SUCCESS == status)
{
// list each processor frequency
PPROCESSOR_POWER_INFORMATION ppi = (PPROCESSOR_POWER_INFORMATION)pBuffer;
for(DWORD nIndex = 0; nIndex < si.dwNumberOfProcessors; nIndex++)
{
std::cout << "Processor #" << ppi->Number << " frequency: "
<< ppi->CurrentMhz << " MHz" << std::endl;
ppi++;
}
}
else
{
std::cout << "CallNtPowerInformation failed. Status: " << status << std::endl;
}
delete []pBuffer;
system("pause");
return status;
}