Re: Windows 7 Prozessorauslastung auslesen / Lautstärke rege
Zitat:
Delphi-Quellcode:
Mal so ohne zu testen.
function GetCPUUsage: Integer;
var spi : SYSTEM_PERFORMANCE_INFORMATION; sti : SYSTEM_TIME_INFORMATION; sbi : SYSTEM_BASIC_INFORMATION; ret: DWORD; 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 ret := (NTQuerySystemInformation(SYS_PERFORMANCE_INFO, @spi, sizeof(SYSTEM_PERFORMANCE_INFORMATION), 0) if ret = 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 else ShowMessage(IntToStr(ret)); end; end; |
Re: Windows 7 Prozessorauslastung auslesen / Lautstärke rege
Habs grad getestet.
Geht aber leider nicht. Ich krieg immer nur den Wert : 3221225476 Sorry für meine Unwissenheit :pale: . |
Re: Windows 7 Prozessorauslastung auslesen / Lautstärke rege
Dann mach mal aus dem DWORD einen Integer.
|
Re: Windows 7 Prozessorauslastung auslesen / Lautstärke rege
Jetzt krieg ich immer nur den Wert : -1073741820
|
Re: Windows 7 Prozessorauslastung auslesen / Lautstärke rege
Das sieht mir nicht richtig aus. Ich habe noch nie negative Fehlercodes gesehen. Da muss dann wohl mal jemand ran, der auch, wie du, Windows 7 hat. Ich habe nur XP.
|
Re: Windows 7 Prozessorauslastung auslesen / Lautstärke rege
Ok, trotzdem danke für die Hilfe.
|
AW: Windows 7 Prozessorauslastung auslesen / Lautstärke regeln
Das Thema ist zwar schon alt, aber ich bin über den selben Fehler gestolpert.
Das Problem ist nicht Windows 7, sondern der neue Prozessor (oder DIE Prozessoren / Prozessorkerne). Zur Erklärung:
Delphi-Quellcode:
Wenn man die Funktion NTQuerySystemInformation() mit dem Parameter SYS_PERFORMANCE_INFO aufruft, werden die Informationen zu allen Prozessorkernen in den zweiten Parameter (@spi) geschrieben. Wenn man aber als Parameterlänge nur die einfache Größe angibt (
if (NTQuerySystemInformation(SYS_PERFORMANCE_INFO, @spi, sizeof(SYSTEM_PERFORMANCE_INFORMATION), 0)= NO_ERROR) then "<-- Bei dieser Zeile flieg ich raus"
Delphi-Quellcode:
), dann passen dort auch nur die Informationen zu einem CPU-Kern rein. Als Folge entsteht dieser Fehlercode.
sizeof(SYSTEM_PERFORMANCE_INFORMATION)
Richtig müsste es also so aussehen:
Delphi-Quellcode:
Leider ist das ganze (wie so oft) nicht gut dokumentiert. Im MSDN-Eintrag zu NtQuerySystemInformation findet man im Abschnitt SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION den Hinweis, dass der Buffer groß genug sein muss, um ein Array von SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION mit der Länge der im System vorhandenen Prozessoren aufzunehmen. Offenbar trifft das auch auf SYSTEM_PERFORMANCE_INFORMATION zu, ist dort aber nicht dokumentiert ...
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) * sbi.bKeNumberProcessors, 0) = NO_ERROR) then ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:47 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