Reputation: 279
I am unaware of a win32 api function/functions used to query the local PC processor's current speed. I wish not to use WMI because it seems unlikely to be feasible on all PCs.
Upvotes: 12
Views: 12183
Reputation: 163
The frequency obtained by the following method is similar to the CPU speed in the Task Manager
#include <Pdh.h> // link to Pdh.lib
#define YOUR_CPU_MAX_FREQUENCY 3.3
HQUERY hquery;
// https://learn.microsoft.com/en-us/windows/win32/api/pdh/nf-pdh-pdhopenquerya
PdhOpenQueryA(nullptr, NULL, &hquery)
HCOUNTER hcounter;
// https://learn.microsoft.com/en-us/windows/win32/api/pdh/nf-pdh-pdhaddcountera
PdhAddCounterA(hquery, "\\Processor Information(_Total)\\% Processor Performance", NULL, &hcounter)
PdhCollectQueryData(hquery);
Sleep(200);
PdhCollectQueryData(hquery);
PDH_FMT_COUNTERVALUE value;
PdhGetFormattedCounterValue(hcounter, PDH_FMT_DOUBLE, nullptr, &value);
PdhCloseQuery(hquery);
double frequency = value.doubleValue / 100 * YOUR_CPU_MAX_FREQUENCY;
frequency will be a value that changes in real time (in ghz), such as 1.2, 2.6, ...
Upvotes: 0
Reputation: 318
You can call the Windows API function CallNtPowerInformation with the argument ProcessorInformation. It returns a PROCESSOR_POWER_INFORMATION structure which tells you the current and max CPU speed for each of your system's CPUs.
This is only supported on Win32 desktop, not Metro or Windows Phone, though.
Upvotes: 20
Reputation: 6831
You read it from the registry using the usual registry functions
Upvotes: 0
Reputation: 94439
You can (usually) get the processor speed using the QueryPerformanceFrequency
function. I'm saying "usually" since this function returns the frequency of the performance timer component of the system, but virtually all current CPU's available operate at the same frequency as the performance timer component.
This function is available since Windows 2000, so chances are good that it's supported on most of todays PCs.
Upvotes: 1