Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Aktuelle CPUFrequenz abfragen (SpeedStep) (https://www.delphipraxis.net/187231-aktuelle-cpufrequenz-abfragen-speedstep.html)

DelTurbo 10. Nov 2015 10:38

Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Hallo,
ich möchte gerne die Aktuelle CPU Frequenz abfragen. Aber alle Demos die ich gefunden habe zeigen mir nur 4Ghz an obwohl die CPU ohne last auf 0.8Ghz läuft.

Wie kann man die wirklich aktuelle Frequenz abfragen?

Danke im Voraus

Amateurprofi 10. Nov 2015 12:03

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Ich mache das so:

Delphi-Quellcode:
FUNCTION TimeStamp:Int64;
asm
   rdtsc
   {$IFDEF CPUX64}
   shl  rdx,32
   or   rax,rdx
   {$ENDIF}
end;
Delphi-Quellcode:
FUNCTION GetTimeStampFrequency:Int64;
var OldPriority:Word; Q0,Q1,Qf,Ts0,Ts1:Int64; Seconds:Extended;
    PaMask,SaMask,TaMask:NativeUInt;
begin
   // Thread nur auf einer CPU ausführen
   GetProcessAffinityMask(GetCurrentProcess,PaMask,SaMask);
   if PaMask<>0 then begin
      TaMask:=1;
      while TaMask and PaMask=0 do TaMask:=TaMask shl 1;
      SetThreadAffinityMask(GetCurrentThread,TaMask);
   end;
   // Priorität des Threads hochsetzen
   OldPriority:=GetThreadPriority(GetCurrentThread);
   SetThreadPriority(GetCurrentThread,THREAD_PRIORITY_TIME_CRITICAL);
   // QPC- und TimeStamp-Ticks für 10 ms holen
   QueryPerformanceCounter(Q0);
   Ts0:=TimeStamp;
   Sleep(10);
   Ts1:=TimeStamp;
   QueryPerformanceCounter(Q1);
   // Anhand QPF die TimeStamp-Frequenz ermitteln
   QueryPerformanceFrequency(Qf);
   Seconds:=(Q1-Q0)/Qf;
   Result:=Trunc((Ts1-Ts0)/Seconds+0.5); // Ticks/s
   // Priorität des Threads auf alten Wert stellen und Thread für alle
   // CPUs freigeben
   SetThreadPriority(GetCurrentThread,OldPriority);
   if PaMask<>0 then SetThreadAffinityMask(GetCurrentThread,PaMask);
end;

DelTurbo 10. Nov 2015 13:37

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Klappt leider nicht. Egal ob mit Last oder ohne. Die Werte sind schon etwas komig. :roll:
Abgefragt mit einem Timer alle 500ms. Getestet auf einem Laptop mit Intel Core2(Duo) P8600.

Ohne Last. (0,8Ghz)
312738611
241239801
266993435
2393030897
2393232643
2393188605
2393225644
2393234530

Mit Last. (2,5Ghz)
137983889
2393447349
2393455115
2393582694
304749688
2393445973
122108721
183223288
90529087
2393630273

Gruß

Bernhard Geyer 10. Nov 2015 18:11

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Es gibt nicht (mehr) die aktuelle CPU-Geschwindigkeit. Jeder Kern kann unterschiedlich getaktet sein.
Ebenfalls wird dein Programm bei einer Messung (wenn du ihn nicht auf einen kern bindest) wild zwischen den Kernen hin und her "geworfen" was die Ausführung betrifft.

Perlsau 10. Nov 2015 18:56

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Keine Ahnung, ob das hilft, aber ich verwende in Win7 das Gadget CPU-Meter, das mir die Auslastung aller Kerne sowie den verwendeten RAM anzeigt. Ob die Anzeige dieses Gadgets korrekt ist, vermag ich nicht wirklich zu beurteilen. Zumindest stimmt die Gadget-Anzeige in etwa mit der Anzeige im Ressourcenmonitor überein.

Immerhin zeigt die Existenz dieses Gadgets, daß es irgendwie gehen muß :stupid:

Dalai 10. Nov 2015 19:08

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Eine ganz simple Variante ist, die Klasse Win32_Processor via WMI zu befragen (Class property CurrentClockSpeed). Aber wie bereits richtig gesagt wurde, gibt das nur den Takt eines Kerns an, der nicht notwendigerweise mit dem Takt der anderen Kerne übereinstimmen muss. Daher fällt das eher in die Kategorie "CPU-Frequenz auslesen für Arme" ;).

MfG Dalai

hathor 10. Nov 2015 19:19

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Die WMI-Funktion ist ohne Refresher nicht nutzbar.

Delphi-Quellcode:
//     Version: 1.8.3.0 
//     LIABILITY DISCLAIMER
//     THIS GENERATED CODE IS DISTRIBUTED "AS IS". NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED.
//     YOU USE IT AT YOUR OWN RISK. THE AUTHOR NOT WILL BE LIABLE FOR DATA LOSS,
//     DAMAGES AND LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING OR MISUSING THIS CODE.
//----------------------------------------------------------------------------------------------------
program GetWMI_Info;

{$APPTYPE CONSOLE}

uses
 // SysUtils, ActiveX, ComObj, Variants;
  System.SysUtils,
  Winapi.ActiveX,
  System.Win.ComObj,
  System.Variants;

const
  WbemUser =''; WbemPassword =''; WbemComputer ='localhost';  
  wbemFlagForwardOnly = $00000020;

function VarToInt(const AVariant: Variant): INT64;// integer;
begin Result := StrToIntDef(Trim(VarToStr(AVariant)), 0); end;

procedure GetCIM_ProcessorInfo;
var
  FSWbemLocator : OLEVariant;
  FWMIService  : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject  : OLEVariant;
  oEnum        : IEnumvariant;
  iValue       : LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService  := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM CIM_Processor','WQL',wbemFlagForwardOnly);
  oEnum        := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
    Writeln(Format('AddressWidth                  %d',[VarToInt(FWbemObject.AddressWidth)]));// Uint16
    Writeln(Format('Availability                  %d',[VarToInt(FWbemObject.Availability)]));// Uint16
    Writeln(Format('Caption                       %s',[VarToStr(FWbemObject.Caption)]));// String
    Writeln(Format('ConfigManagerErrorCode        %d',[VarToInt(FWbemObject.ConfigManagerErrorCode)]));// Uint32
    Writeln(Format('ConfigManagerUserConfig       %s',[VarToStr(FWbemObject.ConfigManagerUserConfig)]));// Boolean
    Writeln(Format('CreationClassName             %s',[VarToStr(FWbemObject.CreationClassName)]));// String
    Writeln(Format('CurrentClockSpeed             %d',[VarToInt(FWbemObject.CurrentClockSpeed)]));// Uint32
    Writeln(Format('DataWidth                     %d',[VarToInt(FWbemObject.DataWidth)]));// Uint16
    Writeln(Format('Description                   %s',[VarToStr(FWbemObject.Description)]));// String
    Writeln(Format('DeviceID                      %s',[VarToStr(FWbemObject.DeviceID)]));// String
    Writeln(Format('ErrorCleared                  %s',[VarToStr(FWbemObject.ErrorCleared)]));// Boolean
    Writeln(Format('ErrorDescription              %s',[VarToStr(FWbemObject.ErrorDescription)]));// String
    Writeln(Format('Family                        %d',[VarToInt(FWbemObject.Family)]));// Uint16
    Writeln(Format('InstallDate                   %s',[VarToStr(FWbemObject.InstallDate)]));// Datetime
    Writeln(Format('LastErrorCode                 %d',[VarToInt(FWbemObject.LastErrorCode)]));// Uint32
    Writeln(Format('LoadPercentage                %d',[VarToInt(FWbemObject.LoadPercentage)]));// Uint16
    Writeln(Format('MaxClockSpeed                 %d',[VarToInt(FWbemObject.MaxClockSpeed)]));// Uint32
    Writeln(Format('Name                          %s',[VarToStr(FWbemObject.Name)]));// String
    Writeln(Format('OtherFamilyDescription        %s',[VarToStr(FWbemObject.OtherFamilyDescription)]));// String
    Writeln(Format('PNPDeviceID                   %s',[VarToStr(FWbemObject.PNPDeviceID)]));// String
    Writeln(Format('PowerManagementCapabilities   %d',[VarToInt(FWbemObject.PowerManagementCapabilities)]));// Array of Uint16
    Writeln(Format('PowerManagementSupported      %s',[VarToStr(FWbemObject.PowerManagementSupported)]));// Boolean
    Writeln(Format('Role                          %s',[VarToStr(FWbemObject.Role)]));// String
    Writeln(Format('Status                        %s',[VarToStr(FWbemObject.Status)]));// String
    Writeln(Format('StatusInfo                    %d',[VarToInt(FWbemObject.StatusInfo)]));// Uint16
    Writeln(Format('Stepping                      %s',[VarToStr(FWbemObject.Stepping)]));// String
    Writeln(Format('SystemCreationClassName       %s',[VarToStr(FWbemObject.SystemCreationClassName)]));// String
    Writeln(Format('SystemName                    %s',[VarToStr(FWbemObject.SystemName)]));// String
    Writeln(Format('UniqueId                      %s',[VarToStr(FWbemObject.UniqueId)]));// String
    Writeln(Format('UpgradeMethod                 %d',[VarToInt(FWbemObject.UpgradeMethod)]));// Uint16

    Writeln('');
    FWbemObject:=Unassigned;
  end;
end;


begin
 try
    CoInitialize(nil);
    try
      GetCIM_ProcessorInfo;
    finally
      CoUninitialize;
    end;
 except
    on E:EOleException do
        Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 Writeln('Press Enter to exit');
 Readln;    
end.

DelTurbo 11. Nov 2015 08:13

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Ich glaube ihr verwechselt die Auslastung, die pro Kern anders ist, mit der CPU Clockspeed. Diese Frequenz ist, wenn man es mal platt sagt, Global. Es ist nicht möglich einen Kern mit 1Ghz und einen anderen Kern mit 2Ghz laufen zu lassen.

Dieser Speed wird aus einer Grundfrequenz mit einem Multiplier festgelegt bzw. eingestellt. Es würd ja schon reichen wenn man die Grundfrequenz und den Multiplier wert lesen könnte. Dann einfach mal nehmen und schon hat man den aktuellen Takt. Aber leider find ich rein Garnichts wie und wo ich das auslesen könnte. Es muss aber gehen da z.b. das Programm CoreTemp genau diese werte anzeigt.

Code:
Multiplikator: Der endgültige Takt des Prozessors ergeben sich aus dem Produkt des BCLK und des Multiplikators. Also in Kurzform: BCLKxMulti=CPU-Takt. Da der Multiplikator bei den meisten CPUs nach oben hin gesperrt ist, führt nur eine Erhöhung des BCLK den gewünschten Effekt der Taktsteigerung herbei.
 Bsp.: Jeder i7 hat einen BCLK 133MHz, der i7-920 hat den Multi 20
 133MHz * 20 = 2667MHz
Quelle: http://extreme.pcgameshardware.de/ov...cking.html#a06

Gruß

EDIT: Danke @hathor, das zeigt mir wirklich die Aktuelle Frequenz an. Ist zwar nicht schnell, aber gut brauchbar.

DelTurbo 11. Nov 2015 09:27

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
@hathor,
ich habe gerade gemerkt, das CurrentClockSpeed nicht den TurboSpeed anzeigt. Er zeigt dann nur den MaxClockSpeed (4001) an. Hat eventuell jemand eine Idee wie ich das "richtig" angezeigt bekomme.

Ich habe es auf 2 verschiedenen Rechner getestet.

Danke im Voraus

hathor 11. Nov 2015 11:24

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Liste der Anhänge anzeigen (Anzahl: 2)
Mit VBS ist das einfach:

Code:
Set objWMI = GetObject("winmgmts://./root\cimv2")
set objRefresher = CreateObject("WbemScripting.Swbemrefresher")
Set objInterfaces = objRefresher.AddEnum(objWMI, "CIM_Processor").ObjectSet
Dim strList, I
Wscript.Echo "Click and Wait 10-15 sec ..."
    objRefresher.Refresh
    For each RefreshItem in objRefresher
        For each objInstance in RefreshItem.ObjectSet
        strList = strList & objInstance.Name _
      & vbnewline & " CurrentClockSpeed:  " & objInstance.CurrentClockSpeed _ 
      & vbnewline & " MaxClockSpeed:       " & objInstance.MaxClockSpeed
        Next
    Next
strList = strList & vbnewline & "--------------------------------"

For I = 1 to 10
    objRefresher.Refresh
    For each RefreshItem in objRefresher
        For each objInstance in RefreshItem.ObjectSet
        strList = strList & vbnewline & " CurrentClockSpeed:   " & objInstance.CurrentClockSpeed
        Next
    Next
    Wscript.Sleep 500
Next
Wscript.Echo strList

Dalai 11. Nov 2015 11:31

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Zitat:

Zitat von DelTurbo (Beitrag 1321106)
Ich glaube ihr verwechselt die Auslastung, die pro Kern anders ist, mit der CPU Clockspeed. Diese Frequenz ist, wenn man es mal platt sagt, Global. Es ist nicht möglich einen Kern mit 1Ghz und einen anderen Kern mit 2Ghz laufen zu lassen.

Doch, genau das passiert bei/mit aktuellen Prozessoren. Einfach mal CPU-Z laufen lassen und nur einen Kern auslasten* und schon wirst du bei z.B. einem AMD K10 (z.B. Athlon II) sehen, dass die Taktung pro Kern anders ist. Wenn der eine Kern voll ausgelastet ist, geht der Takt auf Maximum auf diesem Kern, und wenn die anderen Kerne nicht belastet sind, dann bleiben die bei ihrem Minimaltakt.

Hierzu kann man z.B. einen Benchmark laufen lassen und dessen Prozess via Taskmanager auf einen Kern festnageln.

MfG Dalai

DelTurbo 11. Nov 2015 11:33

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Das zeigt auch nur die Grundtaktfrequenz des Prozessors. Turbo wären bei dem Prozessor 3,3.

Quelle: http://ark.intel.com/de/products/648...up-to-3_30-GHz

DelTurbo 11. Nov 2015 11:43

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich frage mich wo du das siehst? Es wird nur eine CPU (Prozessor #1) angezeigt. Was ja auch richtig ist. Es ist ja nur einer da.

Wie das bei AMD ist weiß ich nicht.

Dalai 11. Nov 2015 11:57

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Zitat:

Zitat von DelTurbo (Beitrag 1321132)
Ich frage mich wo du das siehst? Es wird nur eine CPU (Prozessor #1) angezeigt. Was ja auch richtig ist. Es ist ja nur einer da.

Einfach mal einen Rechtsklick auf das Fenster machen und in diesem Kontextmenü sieht man den Takt pro Kern. Du kannst auch irgendein anderes Programm benutzen, z.B. Core Temp, wo man den Takt pro Kern direkt sieht.

MfG Dalai

DelTurbo 11. Nov 2015 12:06

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Aha, wusste ich nicht. Trotzdem laufen alle 4 mit der gleichen Frequenz. Egal ob ich was Zippe (Geht dann im Turbo auf 4,4) oder er im idle ist (0,8).

Wie gesagt, vielleicht ist es bei AMD anders. Habe leider keinen AMD hier. Trotzdem erklärt es nicht warum ich im Turbomode nicht die 4,4 angesagt bekomme, sondern nur 4,0.

Gruß

Dalai 11. Nov 2015 12:19

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Zitat:

Zitat von DelTurbo (Beitrag 1321134)
Aha, wusste ich nicht. Trotzdem laufen alle 4 mit der gleichen Frequenz. Egal ob ich was Zippe (Geht dann im Turbo auf 4,4) oder er im idle ist (0,8).

Hast du den auslastenden Prozess auf einen Kern festgenagelt? Sonst wird das natürlich nix, weil der Prozess zwischen den Kernen hin- und hergeschoben wird und so eine gleichmäßige Auslastung rauskommt.

Möglich ist aber, dass das bei Intel CPUs anders aussieht und entweder nicht alle Modelle eine Taktung pro Kern kennen oder Intel das gar nicht macht; letzteres glaube ich aber nicht wirklich.

Zitat:

Trotzdem erklärt es nicht warum ich im Turbomode nicht die 4,4 angesagt bekomme, sondern nur 4,0.
So wie ich das kenne, wird der Turbo ausschließlich dann geschaltet, wenn die Last auf wenigen Kernen (oder gar nur einem) anliegt, und dann taktet nur dieser eine Kern über seinen Nominaltakt. Warum? Nun, ganz einfach: würde der Turbo geschaltet, wenn alle Kerne ausgelastet sind, wozu dann ein Turbo und nicht gleich den Nominaltakt entsprechend angeben? Dazu kommt noch, dass der Prozessor seine TDP nicht überschreiten darf, was er aber bei Turbo auf allen Kernen tun würde, weil der Nominaltakt nunmal geringer ist als der Turbo, und die TDP am Nominaltakt ausgerichtet ist.

MfG Dalai

Perlsau 11. Nov 2015 13:02

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Zitat:

Zitat von DelTurbo (Beitrag 1321106)
Ich glaube ihr verwechselt die Auslastung, die pro Kern anders ist, mit der CPU Clockspeed.

In der Tat: Diese Verwechslung gebe ich ganz offen zu :thumb: ...nichts für ungut, Ausreden hab ich jetzt grad keine parat, sorry :stupid:

DelTurbo 11. Nov 2015 13:08

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Pfff, irren ist Menschlich. Sonst gäbe es keine Radiergummis :)
Was meinst du wie oft ich mich schon geirrt habe. :-D

Perlsau 11. Nov 2015 13:18

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Zitat:

Zitat von DelTurbo (Beitrag 1321145)
Pfff, irren ist Menschlich. Sonst gäbe es keine Radiergummis :)

So ist es und so wird es immer sein :lol:

Zitat:

Zitat von DelTurbo (Beitrag 1321145)
Was meinst du wie oft ich mich schon geirrt habe. :-D

Keine Ahnung, dazu habe ich keine Meinung :cyclops:

Dalai 11. Nov 2015 14:37

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Da offenbar immer noch nicht geglaubt wird, dass die Kerne unterschiedlich takten können, mal ein Beweis dafür im Anhang. Um das Ergebnis zu erreichen, habe ich WinRAR auf einen Kern festgetackert und den integrierten Benchmark gestartet.

MfG Dalai

DelTurbo 11. Nov 2015 14:45

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Öhm, ich dachte ich hätte das eben gepostet... *grübel*. Also Gelesen habe ich das nun einmal. Also scheint es wohl so zu sein. Ich selber habs nicht hinbekommen. Ich hatte einen Kern unter voll last, aber irgendwie hat sich dann CPU-Z nicht mehr geupdated.

Interessanter wäre, wie ich das auslesen kann wenn die Clock über MaxClock geht.

Gruß

hathor 11. Nov 2015 16:17

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Liste der Anhänge anzeigen (Anzahl: 2)
Wer CORETEMP hat, kann das Programm im Anhang nutzen - es nutzt SharedMemory von CT.

Rollo62 12. Nov 2015 07:13

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Ist hier was dabei was dir weiterhilft ?

https://theroadtodelphi.wordpress.com/tag/smbios-2/

http://wiki.delphi-jedi.org/wiki/JCL_Help:GetCpuInfo

Rollo

DelTurbo 12. Nov 2015 07:36

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Werde ich mir heute im laufe des Tages ansehen und berichten.

Vielen dank an euch

hathor 12. Nov 2015 10:01

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Liste der Anhänge anzeigen (Anzahl: 2)
Wer bis zu 24 Cores hat...

Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, System.Win.Registry;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Timer1: TTimer;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    procedure RUN(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

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;
      TPowerInfoArray = array[0..0] of PROCESSOR_POWER_INFORMATION;
      PPowerInfoArray = ^TPowerInfoArray;

var
      PowerInfos: Pointer;
      PowerInfoArray: PPowerInfoArray absolute PowerInfos;
      HIGHEST, LOWEST : INTEGER;
      SysInfo: SYSTEM_INFO;

implementation

    {$R *.dfm}

procedure MM(s:string); begin Form1.Memo1.Lines.Add(s); end;

Function GetProzessorName: String;
Var Reg: TRegistry;
Begin
   Result := 'Processor ?';
   Reg := TRegistry.Create(KEY_READ);
   Try
     Reg.RootKey := HKEY_LOCAL_MACHINE;
     Reg.OpenKey('Hardware\Description\System\CentralProcessor\0', False);
     Result := Reg.ReadString('ProcessorNameString');
   Finally
     Reg.free;
   End;
End;

function CallNtPowerInformation(InformationLevel: DWORD; InPutBuffer: Pointer; InputBufferSize: ULONG; OutPutBuffer:
      Pointer; OutPutBufferSize: ULONG): DWORD; stdcall; external powrproflib;

procedure TForm1.Button1Click(Sender: TObject);
begin
   Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   HIGHEST:= 0;
   LOWEST:= 10000;
   Label3.Caption:= GetProzessorName;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   Memo1.clear; MM('');
   RUN(Self);
   Label1.Caption:= 'HIGHEST FREQ: '+INTTOSTR(HIGHEST)+' MHz';
   Label2.Caption:= 'LOWEST FREQ: '+INTTOSTR(LOWEST)+' MHz';
   Button1.SetFocus;
end;

procedure TForm1.RUN(Sender: TObject);
var size, ret: Cardinal;
    CURR,HIGH,LIMIT, i :Integer;
begin
//    GetNativeSystemInfo(SysInfo);
//    Caption:= 'Cores: '+INTTOSTR(SysInfo.dwNumberOfProcessors);
    size := SizeOf(PROCESSOR_POWER_INFORMATION) * 24;//or SysInfo.dwNumberOfProcessors;
    GetMem(PowerInfos, size);
    ZeroMemory(PowerInfos, size);
    ret := CallNTPowerInformation(11, nil, 0, PowerInfos, size);
      if ret = ERROR_SUCCESS then
        begin
          PowerInfoArray := PowerInfos;
          for i := 0 to 23 do  // 24 Cores - enough ?
          begin
          if i> PowerInfoArray^[i].Number then EXIT;
          Label6.Caption:= 'Idle: '+INTTOSTR(PowerInfoArray^[i].CurrentIdleState);

            CURR:= Round(PowerInfoArray^[i].CurrentMhz div 10)* 10;
            HIGH:= Round(PowerInfoArray^[i].MaxMhz div 10)* 10;
            LIMIT:= Round(PowerInfoArray^[i].MhzLimit div 10)*10;
            Label4.Caption:= 'MaxMhz: '+INTTOSTR(HIGH)+ ' MHz';
            Label5.caption:= 'MhzLimit: '+INTTOSTR(LIMIT)+ ' MHz';
            if CURR > HIGHEST then HIGHEST:= CURR;
            if CURR < LOWEST then LOWEST:= CURR;

         case PowerInfoArray^[i].Number of
           0: MM(' CORE '+ IntToStr(i)+': ' + IntToStr(CURR)+' MHz'); // Core 0
           1: MM(' CORE '+ IntToStr(i)+': ' + IntToStr(CURR)+' MHz'); // Core 1
           2: MM(' CORE '+ IntToStr(i)+': ' + IntToStr(CURR)+' MHz'); // Core 2
           3: MM(' CORE '+ IntToStr(i)+': ' + IntToStr(CURR)+' MHz'); // Core 3
           4: MM(' CORE '+ IntToStr(i)+': ' + IntToStr(CURR)+' MHz'); // Core 4
           5: MM(' CORE '+ IntToStr(i)+': ' + IntToStr(CURR)+' MHz'); // Core 5
           6: MM(' CORE '+ IntToStr(i)+': ' + IntToStr(CURR)+' MHz'); // Core 6
           7: MM(' CORE '+ IntToStr(i)+': ' + IntToStr(CURR)+' MHz'); // Core 7
           8: MM(' CORE '+ IntToStr(i)+': ' + IntToStr(CURR)+' MHz'); // Core 8
           9: MM(' CORE '+ IntToStr(i)+': ' + IntToStr(CURR)+' MHz'); // Core 9
           10: MM(' CORE '+ IntToStr(i)+': ' + IntToStr(CURR)+' MHz'); // Core 10
           11: MM(' CORE '+ IntToStr(i)+': ' + IntToStr(CURR)+' MHz'); // Core 11
           // extent to 23
         end;
        end;
      end
      else
      FreeMem(PowerInfos, size);
end;

end.

DelTurbo 12. Nov 2015 12:54

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Hi,
habe nun alles mal getestet. Ist alles nicht brauchbar für meine Zwecke. Am besten ist immer noch Post #7 von hathor. Das einzige was nicht klappt ist das er den Turbo wert anzeigt. Ansonsten ist es sehr gut. An diese stelle ein Danke schön....

Gruß

hathor 12. Nov 2015 13:06

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Deine CPU INTEL P8600 hat KEINEN Turbo-Modus:
Intel® Turbo-Boost-Technik: No
aber:
Erweiterte Intel SpeedStep® Technologie: Yes
http://ark.intel.com/de/products/355...z-1066-MHz-FSB

Das Programm in #25 sollte das richtig anzeigen.

DelTurbo 12. Nov 2015 13:24

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Uff, nun hab ich es gefunden. Da hast du mich gerade aber ans grübeln gebracht.

Du beziehst dich auf Post #3. Das das Laptop keinen Turbo hat weiß ich. Es ging darum das ich den Post #2 getestet habe. Da war noch nix mit Turbomode.

Ansonsten teste ich natürlich auf CPUs die Turbo haben. Sonst würde es wenig sinn machen, gell. ;) Deinen Post#25 werde ich nachher mal probieren.

Gruß

DelTurbo 12. Nov 2015 13:49

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Geht leider nicht. Bleibt bei 4Ghz stehen. Da müsste aber 4,4 stehen. Ich lasse weiterhin das von Post #7 laufen. Trotzdem nochmal danke :thumb:

hathor 12. Nov 2015 13:56

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Woher kommt der Wert 4,4 GHz ?

Zitat:
Dank Dynamic Acceleration (später Turbo Modus genannt), kann sich ein Kern um eine Stufe übertakten, wenn der zweite im Idle Modus (Leerlauf) ist.

Das integrierte Enhanced Speedstep kann die Taktfrequenz des Prozessors dynamisch an die Leistungsanforderungen anpassen. Dadurch läuft die CPU ohne Last nur mit 1200 MHz.

Die P8600 ist erstaunlich langsam:

DelTurbo 12. Nov 2015 14:15

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Zitat:

Zitat von hathor (Beitrag 1321313)
Woher kommt der Wert 4,4 GHz ?

Von CoreTemp und Intel ;)

http://ark.intel.com/de/products/808...up-to-4_40-GHz

CoreTemp habe ich schon Jahrelang mitlaufen. Man möchte ja wissen was die Kiste so macht. :)
Bevor du fragst... Das IntelTool zeigte es mir auch an.

Ohne last habe ich 0,8 und dann halt die 4,4

hathor 12. Nov 2015 14:20

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Es geht nicht mehr um P8600 ?
...Intel-Core-i7-4790K-Processor-8M-Cache-up-to-4_40-GHz

DelTurbo 12. Nov 2015 14:27

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Nein, das ist mein Laptop. Damit habe ich abends schnell den Code von Post #2 getestet. Ich wollte sehen ob das überhaupt läuft. Habe ich aber eben schon gepostet.

Zumal der Laptop mir nie 4,0Ghz anzeigen würde. Außer er wäre kaputt :-D

hathor 12. Nov 2015 15:18

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Liste der Anhänge anzeigen (Anzahl: 2)
"Ich habe da mal was vorbereitet..."

DelTurbo 12. Nov 2015 15:36

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von hathor (Beitrag 1321324)
"Ich habe da mal was vorbereitet..."

Ich denke mal du wolltest einen Snapshot davon. Habe ich gemacht. Man sieht das auf 4400 rennt. Nu mach dir aber nicht soviel Arbeit. Post 7 läuft doch soweit.

Gruß

hathor 12. Nov 2015 15:53

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Zitat:

Zitat von DelTurbo (Beitrag 1321329)
Nu mach dir aber nicht soviel Arbeit.
Gruß

War schon in meinem "Depot"... nur kleine Änderungen gemacht...

Na, also - geht doch! Alles klar!

DelTurbo 12. Nov 2015 16:02

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Achso, den CPUNamen habe ich nicht weg gemacht. Der zeigt da nix an.

hathor 12. Nov 2015 17:20

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zeigt der folgende Code etwas an?

Delphi-Quellcode:
Function GetProzessorName: String;
Var Reg: TRegistry;
Begin
   Result := 'Processor ?';
   Reg := TRegistry.Create(KEY_READ);
   Try
     Reg.RootKey := HKEY_LOCAL_MACHINE;
     Reg.OpenKey('Hardware\Description\System\CentralProcessor\0', False);
     Result := Reg.ReadString('ProcessorNameString');
   Finally
     Reg.free;
   End;
End;
Im Anhang geändertes Programm:
Wenn CT keinen CPU-Namen liefert, wird aus der Registry gelesen.

DelTurbo 13. Nov 2015 08:33

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Zitat:

Zitat von hathor (Beitrag 1321352)
Zeigt der folgende Code etwas an?

Jap...

Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz

hathor 13. Nov 2015 10:02

AW: Aktuelle CPUFrequenz abfragen (SpeedStep)
 
Liste der Anhänge anzeigen (Anzahl: 2)
Manche CPU-Namen sind zu lang, deshalb Form geändert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:02 Uhr.
Seite 1 von 2  1 2      

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