Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi CPU Temperatur und CPU Auslastung auslesen (https://www.delphipraxis.net/13944-cpu-temperatur-und-cpu-auslastung-auslesen.html)

VirusXP 29. Dez 2003 17:46


CPU Temperatur und CPU Auslastung auslesen
 
Hi Leute,
ich bin auf der Suche nach Lösungsvorschlägen zu meinem Problem (s.oben).
Ich hab zwar schon massig im Forum gefunden, kann aber nichts damit anfangen , da ich noch ein
Anfänger auf diesem Gebiet bin. Wäre froh wenn jemand mir das genau erklären oder mir ein
gut dokumentiertes Programm oder eine Unit geben könnte.

Mfg VirusXP

SleepyMaster 29. Dez 2003 22:43

Re: CPU Temperatur und CPU Auslastung auslesen
 
Delphi-Quellcode:
unit CPU;

interface

function CPUUssage:single;

implementation

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

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 = ();
  CPUTime:single;

function CPUUssage:single;
begin
result:=CPUTime;
end;

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');
  status := NtQuerySystemInformation(SystemBasicInformation, @SysBaseInfo, SizeOf(SysBaseInfo), nil);
  if status <> 0 then Exit;
  bLoopAborted := False;
  while not bLoopAborted do
  begin
    status := NtQuerySystemInformation(SystemTimeInformation, @SysTimeInfo, SizeOf(SysTimeInfo), 0);
    if status <> 0 then Exit;
    status := NtQuerySystemInformation(SystemPerformanceInformation, @SysPerfInfo, SizeOf(SysPerfInfo), nil);
    if status <> 0 then Exit;
    if (liOldIdleTime.QuadPart <> 0) then
    begin
      dbIdleTime := Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);
      dbSystemTime := Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);
      dbIdleTime := dbIdleTime / dbSystemTime;
      dbIdleTime := 100.0 - dbIdleTime * 100.0 / SysBaseInfo.bKeNumberProcessors + 0.5;
      CPUTime:=dbIdleTime;
      Application.ProcessMessages;
      bLoopAborted := (GetKeyState(VK_ESCAPE) and 128 = 128) or Application.Terminated;
    end;
    liOldIdleTime := SysPerfInfo.liIdleTime;
    liOldSystemTime := SysTimeInfo.liKeSystemTime;
    Sleep(1000);
  end;
end;

procedure Start;
var
  ThreadID: DWORD;
  ThreadHandle: THandle;
begin
  ThreadHandle:=CreateThread(nil, 0, TFNThreadStartRoutine(@GetCPUUsage),
    nil, 0, ThreadID);
  if ThreadHandle<>0 then CloseHandle(ThreadHandle);
end;

initialization
  Start;

end.
CPUUssage liefert die CPU Auslastung zurück!

SleepyMaster 29. Dez 2003 22:45

Re: CPU Temperatur und CPU Auslastung auslesen
 
Das mit der Temperatur kannst du unter XP wohl vergessen!

kurtm1 29. Dez 2003 23:01

Re: CPU Temperatur und CPU Auslastung auslesen
 
Mit ein paar dll`s und sys Dateien kannst du die CPU Temp auslesen. Habe ich als Projekt erst gemacht.

SleepyMaster 29. Dez 2003 23:06

Re: CPU Temperatur und CPU Auslastung auslesen
 
Dann schick mal was! Mich würde es auch interessieren! ;)

kurtm1 29. Dez 2003 23:12

Re: CPU Temperatur und CPU Auslastung auslesen
 
Schau dir mal diesen Thread an, da solltest du alles finden was du benötigst, sonst frag mich einfach

http://www.delphipraxis.net/internal...ct.php?t=15519

SleepyMaster 29. Dez 2003 23:27

Re: CPU Temperatur und CPU Auslastung auslesen
 
Bekomme immer die Nachricht:
Could not open DriverLINX driver.

J4N 2. Okt 2004 15:42

Re: CPU Temperatur und CPU Auslastung auslesen
 
hm, ich würde gerne eine Konsolenanwendung machen, die in einer einfachen Zeile die Auslastung ausgibt. Warum? Weil ich die Ausgabe dann in PHP einlesen kann, was ich gerne für eine Statusseite nutzen will. Ich hab schon AdCPUUsage (oder wie das hieß) und diese Unit hier probiert, doch beide liefern mir komische Zahlen (AdCPUUsage bringt entweder 100 oder 0 und diese hier immer 0).
Als ich AdCPUUsage mit einer normalen Anwendung probiert habe und auf Knopfdruck auslesen hab lassen, ging es. Ich brauche das Tool für Windows 2K. Kann mir vielleicht einer helfen?

supermuckl 2. Okt 2004 15:49

Re: CPU Temperatur und CPU Auslastung auslesen
 
wieso gibts jetzt 2 threads auf einmal die mit cpu usage auslesen zu tun haben ?

-> torry -> mitec system information -> cpu usag

J4N 2. Okt 2004 15:55

Re: CPU Temperatur und CPU Auslastung auslesen
 
Aalso...Ich bin hier der anständige Programmierer^^
Ich sollte für den "asd" so ein Minitool machen. Doch nur hatte ich keine Ahnung wie ich die Auslastung auslese. Ich hab ihm diese Adresse gegeben und ihm gesagt, er könne ja auch suchen. Nur hat er, anstatt zu suchen eben gepostet, weil er keine Lust hatte und möglichst schnell eine Antwort wollte. Ich hab dann eben hier, nachdem ich nichts gefunden hatte, das zu klappen scheint, mal "richtig" mit weiteren Angaben gepostet. Also braucht man den sinnlosen Post von ihm nicht mehr.

J4N 2. Okt 2004 16:37

Re: CPU Temperatur und CPU Auslastung auslesen
 
muss echt nix aufwendiges sein, nur ne Konsolenanwengung, dass die Auslastung ausgibt, nur bei mir gibts immer quatsch aus :(

Luckie 2. Okt 2004 16:40

Re: CPU Temperatur und CPU Auslastung auslesen
 
Schön, dass du uns sagst, dass die Funktion aus der Unit bei dir Quatsch ausgibt, da es aber wohl genug Benutzer gibt, bei denen es nicht so ist, muss der Fehler irgendwo bei dir liegen. Etwas Quellcode wäre da doch recht hilfreich.

J4N 2. Okt 2004 16:53

Re: CPU Temperatur und CPU Auslastung auslesen
 
naja, was soll ich da an Quelltext geben...
Ich rufe die Funktion CPUUsage auf und die gibt mir ganz genau:
0.00000000000000E+0000 zurück :gruebel:

flomei 2. Okt 2004 17:05

Re: CPU Temperatur und CPU Auslastung auslesen
 
Deutet das nicht auf einen Fehler oder zu großen Wert hin?
Zumindest das E am Ende der Zahl lässt mir so etwas logisch erscheinen...

MfG Florian :hi:

J4N 2. Okt 2004 17:09

Re: CPU Temperatur und CPU Auslastung auslesen
 
Ok, nun hab ich herausgefunden, dass das Programm die Leistung auf Knopfdruck richtig rausgibt. (mit ReadLn). Für den Zweck, für den ich das Programm brauche, ist das aber schlecht (das Programm soll ja von selbst gestartet werden, oder weiß jemand ob man in PHP auch "Enter" drücken kann?)

Luckie 2. Okt 2004 17:11

Re: CPU Temperatur und CPU Auslastung auslesen
 
Readln gibt was aus?

Unit eingebunden und das im OnTimer Event geschrieben und geht:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label1.Caption := FloatToStr(CPUUssage);
end;
Wie und wo du das nun ausgibst, ist vollkommen unerheblich.

J4N 2. Okt 2004 17:14

Re: CPU Temperatur und CPU Auslastung auslesen
 
Ah, ich habs, man muss das Programm so ~3 Sekunden warten lassen, bevor man die Auslastung testet, hätt ich auch draufkommen können :wall:
Sorry, dass ich euch so genervt habe^^
Das Forum hier gefällt mir :) ich denke, ich werde noch des öfteren vorbeischauen. cu ]4N


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 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