![]() |
Windows 7 Prozessorauslastung auslesen / Lautstärke regeln
Hallo Delphi Friends!
Ich hab ein Problem. Ich bin vor kurzem von Win XP auf Win 7 umgestiegen. Davor hab ich mir ein Programm geschrieben, welches mir dauerhaft die Prozessorauslastung in einer progressbar anzeigt. Auf Win XP gings. Auf Win 7 nicht mehr :cry: . Genau dasselbe gilt auch für meine Lautstärkeregelung : Die geht seit dem Umstieg auch nicht mehr. Ich bitte um eure Hilfe. |
Re: Windows 7 Prozessorauslastung auslesen
Hi!
Gibt es Fehlermeldungen oder was heißt "geht nicht mehr"? Sind beides 32bit-Systeme? Grüße, Frederic |
Re: Windows 7 Prozessorauslastung auslesen / Lautstärke rege
Es ist Win 7 64 Bit.
Davor war es Win XP 32 Bit. Es kommt keine Fehlermeldung, aber in der Progressbar wird nichts mehr angezeigt, trotz unverändertem Code. |
Re: Windows 7 Prozessorauslastung auslesen / Lautstärke rege
Hi!
Dann müsstest du uns schon etwas Code zeigen. Allerdings bitte nur zu einem der beiden Probleme - sonst geht es drunter und drüber hier. Du kannst gerne für das andere Programm dann einen anderen Thread aufmachen, aber vllt. versuchst du es erstmal mit einem, vllt. sind es ja ähnliche Ursachen. Grüße, Frederic |
Re: Windows 7 Prozessorauslastung auslesen / Lautstärke rege
Zum einem solltest du eine gescheite Fehlerbehandlung einbauen, damit du auch siehst, was nicht stimmt. Zum anderem 32-Bit <> 64-Bit. Und im Soundsubsystem von Windows gab es von XP auf Vista gravierende Änderungen. Siehe dazu das Blog vom verantwortlichen Programmierer:
![]() |
Re: Windows 7 Prozessorauslastung auslesen / Lautstärke rege
Hier der Code zum auslesen der Prozessorauslastung :
Delphi-Quellcode:
...
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; ... const SYS_BASIC_INFO = 0; SYS_PERFORMANCE_INFO = 2; SYS_TIME_INFO = 3; ... var nOldIdleTime: Int64 = 0; nOldSystemTime : INT64 = 0; nNewCPUTime : ULONG = 0; ... 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; |
Re: Windows 7 Prozessorauslastung auslesen / Lautstärke rege
Dann geh den Code doch mal schrittweise durch und guck, wo du rausfliegst bei den if-Bedingungen.
|
Re: Windows 7 Prozessorauslastung auslesen / Lautstärke rege
Delphi-Quellcode:
...
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 "<-- Bei dieser Zeile flieg ich raus" 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 ... ... |
Re: Windows 7 Prozessorauslastung auslesen / Lautstärke rege
Dann werte doch mal den Rückgabewert aus:
Zitat:
|
Re: Windows 7 Prozessorauslastung auslesen / Lautstärke rege
Tut mir leid, dass kann ich aber nicht, weil ich mir den Code, den ich zum Großteil nicht verstehe, aus einem Tutorial rauskopiert hab,
weil ich damals wie heute nicht wusste wie ich das anstellen soll. Meine Frage ist nur : Geht es in Windows 7 oder nicht, wenn ja, wie. (Nur so nebenbei : Ich benutze Delphi 7). |
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
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 14:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz