Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Windows 7 Prozessorauslastung auslesen / Lautstärke regeln (https://www.delphipraxis.net/146213-windows-7-prozessorauslastung-auslesen-lautstaerke-regeln.html)

Luckie 15. Jan 2010 18:34

Re: Windows 7 Prozessorauslastung auslesen / Lautstärke rege
 
Zitat:

Zitat von Kapitan Bomba
Meine Frage ist nur : Geht es in Windows 7 oder nicht, wenn ja, wie.

Das versuchen wir ja gerade rauszubekommen.

Delphi-Quellcode:
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;
Mal so ohne zu testen.

Kapitan Bomba 15. Jan 2010 18:42

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: .

Luckie 15. Jan 2010 18:42

Re: Windows 7 Prozessorauslastung auslesen / Lautstärke rege
 
Dann mach mal aus dem DWORD einen Integer.

Kapitan Bomba 15. Jan 2010 18:47

Re: Windows 7 Prozessorauslastung auslesen / Lautstärke rege
 
Jetzt krieg ich immer nur den Wert : -1073741820

Luckie 15. Jan 2010 18:58

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.

Kapitan Bomba 15. Jan 2010 19:03

Re: Windows 7 Prozessorauslastung auslesen / Lautstärke rege
 
Ok, trotzdem danke für die Hilfe.

Y.Elm 12. Apr 2012 08:56

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:
if (NTQuerySystemInformation(SYS_PERFORMANCE_INFO, @spi, sizeof(SYSTEM_PERFORMANCE_INFORMATION), 0)= NO_ERROR) then "<-- Bei dieser Zeile flieg ich raus"
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 (
Delphi-Quellcode:
sizeof(SYSTEM_PERFORMANCE_INFORMATION)
), dann passen dort auch nur die Informationen zu einem CPU-Kern rein. Als Folge entsteht dieser Fehlercode.

Richtig müsste es also so aussehen:
Delphi-Quellcode:
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
    ...
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 ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:47 Uhr.
Seite 2 von 2     12   

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