Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   CPU-FREQUENZMESSUNG (https://www.delphipraxis.net/116792-cpu-frequenzmessung.html)

hathor 6. Jul 2008 18:56


CPU-FREQUENZMESSUNG
 
Liste der Anhänge anzeigen (Anzahl: 1)
CPU-FREQUENZMESSUNG

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:

Delphi-Quellcode:
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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! )
http://www.delphipraxis.net/internal...ct.php?t=75505

Für die Suchfunktion:
CPU-FREQUENZMESSUNG
CPUFREQUENZMESSUNG
CPUFREQUENZ
CPUTAKT
CPUCLOCK
CPU CLOCK
PROCESSOR CLOCK


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz