Also in Diesem Quellcode hatte ich das problem
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); // HIER WAR DAS PROBLEM!!!!
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;
[code]
Habe Ihn aber nun durch diesen Quellcode ersetzt
Delphi-Quellcode:
var
Form: TForm;
nOldIdleTime: Int64 = 0;
nOldSystemTime : INT64 = 0;
nNewCPUTime : ULONG = 0;
const
SYS_BASIC_INFO = 0;
SYS_PERFORMANCE_INFO = 2;
SYS_TIME_INFO = 3;
type
SYSTEM_BASIC_INFORMATION = packed record
dwUnknown1 : DWORD;
uKeMaximumIncrement : ULONG;
uPageSize : ULONG;
uMmNumberOfPhysicalPages: ULONG;
uMmLowestPhysicalPage : ULONG;
uMmHighestPhysicalPage : ULONG;
uAllocationGranularity : ULONG;
pLowestUserAddress : POINTER;
pMmHighestUserAddress : POINTER;
uKeActiveProcessors : POINTER;
bKeNumberProcessors : BYTE;
bUnknown2 : BYTE;
wUnknown3 : WORD;
end;
SYSTEM_PERFORMANCE_INFORMATION = packed record
nIdleTime : INT64;
dwSpare : array[0..75]of DWORD;
end;
SYSTEM_TIME_INFORMATION = packed record
nKeBootTime : INT64;
nKeSystemTime : INT64;
nExpTimeZoneBias : INT64;
uCurrentTimeZoneId : ULONG;
dwReserved : DWORD;
end;
function NTQuerySystemInformation(SystemInformationClass: Longint;
SystemInformation: Pointer;
SystemInformationLength: Longint;
ReturnLength: Longint): Longint; stdcall;
external 'ntdll.dll' name 'NtQuerySystemInformation';
function GetCPUUsage: Integer;
var
spi : SYSTEM_PERFORMANCE_INFORMATION;
sti : SYSTEM_TIME_INFORMATION;
sbi : SYSTEM_BASIC_INFORMATION;
begin
result := 0;
if (NTQuerySystemInformation(SYS_BASIC_INFO, @sbi, sizeof(SYSTEM_BASIC_INFORMATION), 0) = NO_ERROR) then
begin
if (NTQuerySystemInformation(SYS_TIME_INFO, @sti, sizeof(SYSTEM_TIME_INFORMATION), 0) = NO_ERROR) then
if (NTQuerySystemInformation(SYS_PERFORMANCE_INFO, @spi, sizeof(SYSTEM_PERFORMANCE_INFORMATION), 0)= NO_ERROR) then
begin
if (nOldIdleTime <> 0) then
begin
nNewCPUTime:= trunc(100-((spi.nIdleTime-nOldIdleTime)/(sti.nKeSystemTime-nOldSystemTime)*100)/sbi.bKeNumberProcessors+0.5);
if (nNewCPUTime <> nOldIdleTime) then
begin
Result := nNewCPUTIME;
end;
end;
nOldIdleTime := spi.nIdleTime;
nOldSystemTime := sti.nKeSystemTime;
end;
end;
end;
procedure TWin2kAppForm.FormClick(Sender: TObject);
begin
Label19.Caption := IntToStr(GetCPUUsage());
end;
procedure TWin2kAppForm.Button11Click(Sender: TObject);
begin
Label19.Caption := IntToStr(GetCPUUsage());
end;
Bin mir nicht Sicher ob ich das ideal gelöst habe aber es funktioniert
Danke an alle die versucht haben zu helfen
das einzige was mir jetzt noch fehlt ist das die CPU Auslastung auch in der ProgressBar angezeigt wird habe da aber noch nicht die passende Variable gefunden.
mfg