Was vor einigen Jahren noch ging,
(Startzeitpunkt festlegen Takte zählen, Endzeitpunkt festlegen),
ist seit Einführung
von Cool'n'Quiet (von AMD) und Speedstep (von INTEL) nicht
mehr möglich. Die Frequenz-Messung dauert viel länger, als
die CPU braucht, um 10-25 mal in der Sekunde den Takt zu ändern.
WINDOWS bietet über die Funktionen in powrprof.dll die
PROCESSOR_POWER_INFORMATION an.
MAXIMALE FREQUENZ = MaxMhz
REALE FREQUENZ = CurrentMhz
Siehe Code:[meta]CPU-FREQUENZMESSUNG,CPUFREQUENZMESSUNG,CPUFREQUENZ,CPUTAKT,CPUCLOCK,CPU CLOCK,PROCESSOR CLOCK[/meta]
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type TForm1 = class(TForm) Label1: TLabel; CPUFREQ1: TLabel; Label3: TLabel; CPUFREQ2: TLabel; Timer1: TTimer; procedure Timer1Timer(Sender: TObject); private public end;
var Form1: TForm1; N, CIS, MIS : Cardinal;
const powrproflib = 'powrprof.dll';
type PROCESSOR_POWER_INFORMATION = packed record Number: Cardinal; MaxMhz: Cardinal; CurrentMhz: Cardinal; MhzLimit: Cardinal; MaxIdleState: Cardinal; CurrentIdleState: Cardinal; end; PPROCESSOR_POWER_INFORMATION = ^PROCESSOR_POWER_INFORMATION;
TCPUFrequency = packed record CurrentMhz: Cardinal; MaxMhz: Cardinal; MhzLimit: Cardinal; end; var CPUFrequency: TCPUFrequency;
implementation
{$R *.dfm}
function CallNtPowerInformation(InformationLevel: DWORD; InPutBuffer: Pointer; InputBufferSize: ULONG; OutPutBuffer: Pointer; OutPutBufferSize: ULONG): DWORD; stdcall; external powrproflib;
function GetCPUFrequency(var CPUFrequency: TCPUFrequency): DWORD; var ppi: PROCESSOR_POWER_INFORMATION; err: DWORD; begin ZeroMemory(@ppi, sizeof(PROCESSOR_POWER_INFORMATION)); err := CallNTPowerInformation(11, nil, 0, @ppi, sizeof(PROCESSOR_POWER_INFORMATION)); if err = 0 then begin CPUFrequency.CurrentMhz := ppi.CurrentMhz; CPUFrequency.MaxMhz := ppi.MaxMhz; CPUFrequency.MhzLimit := ppi.MhzLimit; N:= ppi.Number; CIS:= ppi.CurrentIdleState; MIS:= ppi.MaxIdleState; end; result := err; end;
function ReadFREQ : Boolean; var err: DWORD; begin ZeroMemory(@CPUFrequency, sizeof(TCPUFrequency)); err := GetCPUFrequency(CPUFrequency); if err = 0 then result:= true else result:= false; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin If ReadFREQ = true then BEGIN CPUFREQ1.Caption:= IntToStr(Round(CPUFrequency.CurrentMhz div 10 +1)* 10)+' MHz'; CPUFREQ2.Caption:= IntToStr(Round(CPUFrequency.MaxMhz div 10 +1)* 10)+' MHz'; END; end;
end. |
Nachtrag:
Ein fast identischer Code ist hier: Author : Michael Puff (SORRY! Zu spät gefunden! )
www.delphipraxis.net...owerinformation.html