Delphi-PRAXiS

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)

Kapitan Bomba 15. Jan 2010 17:52


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.

fkerber 15. Jan 2010 17:54

Re: Windows 7 Prozessorauslastung auslesen
 
Hi!

Gibt es Fehlermeldungen oder was heißt "geht nicht mehr"?
Sind beides 32bit-Systeme?


Grüße, Frederic

Kapitan Bomba 15. Jan 2010 17:56

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.

fkerber 15. Jan 2010 17:58

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

Luckie 15. Jan 2010 18:02

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: http://blogs.msdn.com/larryosterman/

Kapitan Bomba 15. Jan 2010 18:06

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;

Luckie 15. Jan 2010 18:11

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.

Kapitan Bomba 15. Jan 2010 18:17

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

Luckie 15. Jan 2010 18:23

Re: Windows 7 Prozessorauslastung auslesen / Lautstärke rege
 
Dann werte doch mal den Rückgabewert aus:
Zitat:

Returns an NTSTATUS success or error code.

Kapitan Bomba 15. Jan 2010 18:29

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

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 20:10 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