Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CPU Auslastung auslesen (https://www.delphipraxis.net/113853-cpu-auslastung-auslesen.html)

mind87 15. Mai 2008 23:40


CPU Auslastung auslesen
 
Guten Abend,

habe vor eine Programm zu schreiben, das diverse Systeminformationen ausliest u.a. CPU und RAM Auslastung. Einen Code für die RAM Auslastung, sowohl als grafische als auch werte basierend habe ich schon.

Code:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  x, y: real;
  memory: TMemoryStatus;
  Ram_ani, Ram : integer;
  aRam:string;

begin
  memory.dwLength := SizeOf(memory);
  GlobalMemoryStatus(memory);
  x := memory.dwTotalPhys - memory.dwAvailPhys;
  y := memory.dwTotalPhys;
  Ram:=round(((x/y)*100));
  str(Ram, aRam);
  edit2.text:=aRam;
  Ram_ani := round(((x/y)*100));
  ProgressBar1.Position := Ram_ani;

end;
Kann mir jemand helfen dies auch für die CPU Auslastung zu schaffen? Im Forum habe ich zwar einen Code gefunden allerdings wird dort die Auslastung der einzelnen Prozesse ausgegeben. Bin in Sachen Delphi-Programmieren noch eher ein Grünschnabel von daher wäre ich mit einem einfachen Lösungsweg zufrieden bei dem das Ziel erreicht wird (auch wenns quick and dirty ist).

Hoffe jemand kann mir weiterhelfen.

Gruß Daniel

smallsmoker 15. Mai 2008 23:44

Re: CPU Auslastung auslesen
 
einfach nur den titel deines thread bei google eingegeben xD:

die schweizer ...

mfg smallsmoker

€: hier gibt es das ganze in einer extra unit und mit einer prozedur:)

cpu usage

LoCrux 16. Mai 2008 06:55

Re: CPU Auslastung auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
HIER cxCPU

EDIT: ANHANG..BESSER

stOrM 16. Mai 2008 09:45

Re: CPU Auslastung auslesen
 
Hi, ich hab mir jetzt die Units / Komponenten meiner Vorposter nicht angesehen, aber falls nicht, ich hatte vor Jahren mal ein ähnliches Projekt und kam zu dem Schluß, wenn ich die CPU Usage ermitteln will, währe es von Vorteil, das in einem seperaten Thread zu machen, weil ewig beim Aufruf in meiner Anwendung sich diese eingefroren hatte...

Kuckst Du hier:

Delphipages

mind87 16. Mai 2008 19:45

Re: CPU Auslastung auslesen
 
Zitat:

Zitat von smallsmoker
einfach nur den titel deines thread bei google eingegeben xD:

die schweizer ...

mfg smallsmoker

€: hier gibt es das ganze in einer extra unit und mit einer prozedur:)

cpu usage

Danke für die Antwort. Habe es gerade eben versucht, bekomme aber bei compilieren eine Fehlermeldung: "Fehler im Modul Unit1: Deklaration der Klasse TForm1 fehlt oder ist fehlerhaft." Ich habe alles in eine Unit geschrieben. Hat jemand eine Idee wo der Fehler zu suchen ist? Danke im Voraus.

Delphi-Quellcode:
const
  SystemBasicInformation = 0;
  SystemPerformanceInformation = 2;
  SystemTimeInformation = 3;

type
  TPDWord = ^DWORD;

  TSystem_Basic_Information = packed record
    dwUnknown1: DWORD;
    uKeMaximumIncrement: ULONG;
    uPageSize: ULONG;
    uMmNumberOfPhysicalPages: ULONG;
    uMmLowestPhysicalPage: ULONG;
    uMmHighestPhysicalPage: ULONG;
    uAllocationGranularity: ULONG;
    pLowestUserAddress: Pointer;
    pMmHighestUserAddress: Pointer;
    uKeActiveProcessors: ULONG;
    bKeNumberProcessors: byte;
    bUnknown2: byte;
    wUnknown3: word;
  end;

type
  TSystem_Performance_Information = packed record
    liIdleTime: LARGE_INTEGER; {LARGE_INTEGER}
    dwSpare: array[0..75] of DWORD;
  end;

type
  TSystem_Time_Information = packed record
    liKeBootTime: LARGE_INTEGER;
    liKeSystemTime: LARGE_INTEGER;
    liExpTimeZoneBias: LARGE_INTEGER;
    uCurrentTimeZoneId: ULONG;
    dwReserved: DWORD;
  end;

var
  NtQuerySystemInformation: function(infoClass: DWORD;
    buffer: Pointer;
    bufSize: DWORD;
    returnSize: TPDword): DWORD; stdcall = nil;


  liOldIdleTime: LARGE_INTEGER = ();
  liOldSystemTime: LARGE_INTEGER = ();

function Li2Double(x: LARGE_INTEGER): Double;
begin
  Result := x.HighPart * 4.294967296E9 + x.LowPart
end;

procedure GetCPUUsage;
var
  SysBaseInfo: TSystem_Basic_Information;
  SysPerfInfo: TSystem_Performance_Information;
  SysTimeInfo: TSystem_Time_Information;
  status: Longint; {long}
  dbSystemTime: Double;
  dbIdleTime: Double;

  bLoopAborted : boolean;

begin
  if @NtQuerySystemInformation = nil then
    NtQuerySystemInformation := GetProcAddress(GetModuleHandle('ntdll.dll'),
      'NtQuerySystemInformation');

  // get number of processors in the system

  status := NtQuerySystemInformation(SystemBasicInformation, @SysBaseInfo, SizeOf(SysBaseInfo), nil);
  if status <> 0 then Exit;

  // Show some information
  with SysBaseInfo do
  begin
      ShowMessage(
      Format('uKeMaximumIncrement: %d'#13'uPageSize: %d'#13+
      'uMmNumberOfPhysicalPages: %d'+#13+'uMmLowestPhysicalPage: %d'+#13+
      'uMmHighestPhysicalPage: %d'+#13+'uAllocationGranularity: %d'#13+
      'uKeActiveProcessors: %d'#13'bKeNumberProcessors: %d',
      [uKeMaximumIncrement, uPageSize, uMmNumberOfPhysicalPages,
      uMmLowestPhysicalPage, uMmHighestPhysicalPage, uAllocationGranularity,
      uKeActiveProcessors, bKeNumberProcessors]));
  end;


  bLoopAborted := False;

  while not bLoopAborted do
  begin

    // get new system time
    status := NtQuerySystemInformation(SystemTimeInformation, @SysTimeInfo, SizeOf(SysTimeInfo), 0);
    if status <> 0 then Exit;

    // get new CPU's idle time
    status := NtQuerySystemInformation(SystemPerformanceInformation, @SysPerfInfo, SizeOf(SysPerfInfo), nil);
    if status <> 0 then Exit;

    // if it's a first call - skip it
    if (liOldIdleTime.QuadPart <> 0) then
    begin

      // CurrentValue = NewValue - OldValue
      dbIdleTime := Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);
      dbSystemTime := Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);

      // CurrentCpuIdle = IdleTime / SystemTime
      dbIdleTime := dbIdleTime / dbSystemTime;

      // CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
      dbIdleTime := 100.0 - dbIdleTime * 100.0 / SysBaseInfo.bKeNumberProcessors + 0.5;

      // Show Percentage
      Form1.Label1.Caption := FormatFloat('CPU Usage: 0.0 %',dbIdleTime);

      Application.ProcessMessages;

      // Abort if user pressed ESC or Application is terminated
      bLoopAborted := (GetKeyState(VK_ESCAPE) and 128 = 128) or Application.Terminated;

    end;

    // store new CPU's idle and system time
    liOldIdleTime := SysPerfInfo.liIdleTime;
    liOldSystemTime := SysTimeInfo.liKeSystemTime;

    // wait one second
    Sleep(1000);
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  GetCPUUsage
end;
[edit=Matze][delphi]-Tags gesetzt. MfG, Matze[/edit]

mind87 16. Mai 2008 21:39

Re: CPU Auslastung auslesen
 
Habe den Fehler gefunden, hatte eine Type Deklaration die im Standardforumlar vorhanden ist. Nun funktioniert es. Danke für die Hilfe.

Gruß Daniel


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

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