Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


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