Entwickler-Ecke

Sonstiges (Delphi) - CPU-Auslastung (Win9x ACPI Problem)


RFZ - Mi 07.01.04 11:21
Titel: CPU-Auslastung (Win9x ACPI Problem)
Moin,
ich würd gern unter Win9x die CPU-Auslastung messen. Dabei gibt es leider ein Problem:
Wenn Win9x im ACPI Modus installiert ist, zeigt der Systemmonitor eine falsche auslastung (Microsoft Knowledge Base Q227131 [http://support.microsoft.com/default.aspx?scid=kb;en-us;227131]).
Erkennen kann man die falsche Auslastung daran, dass sie meisst über 20% liegt (manchmal immer 100%) und v.a. stark fällt wenn man die Maus bewegt.
Dieses Problem hab ich mit Delphi auch, wenn ich z.B. AdCpuUsage nutze, oder die Daten aus der Registry (geht eh nur bei 9x) lese.
Das Shareware Tool "CPU Indicator [http://www.pysoft.com/]" zeigt z.B. die richtige Auslastung.
Kennt jemand von euch noch Komponenten die ich versuchen kann?

cu RFZ


Alexander F - Do 08.01.04 15:33

Schau mal hier:
http://www.aldyn.ru/products/cpu_usage/


RFZ - Do 08.01.04 18:16

Sorry, das selbe Problem.... in Ruhe 30%, bei Mausbewegung 1%...

cu RFZ


mica - Mo 02.02.04 13:34
Titel: CPU-Auslastung
Hallo erstmal,

Genau, das versuche ich auch.
Ich versuche die CPU-Auslastung grafisch darzustellen.
Kannst du mir verraten wie das geht, falls du das Problem schon lösen konntest.
Ich benutze XP-Home
Bin noch Anfänger in Delphi.

Gruß

Mica


Phantom1 - Mo 02.02.04 14:28

@mica: das graphisch anzuzeigen ist eigentlich kein problem, das problem mit win98 kann nicht probieren da ich kein win98 habe.

hier mal ein einfaches beispiel, du braucht ein image und ein timer auf dem formular:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, adcpuusage;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
    CPULast: Array[0..80Of Byte;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Image1.Width:=400;
  Image1.Height:=100;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
Var i: Integer;
begin
  CollectCPUData;
  For i:=79 DownTo 0 Do
    CPULast[i+1]:=CPULast[i];
  CPULast[0]:=Round(GetCPUUsage(0)*100);

  Image1.Picture.Bitmap:=Nil;
  With Image1, Canvas Do Begin
    MoveTo(0,Pred(Height)-CPULast[0]);
    For i:=1 To 80 Do
      LineTo(i*5,Pred(Height)-CPULast[i]);
  End;
end;

end.


Delete - Mo 02.02.04 14:38

Unter Win98 kann man die CPU Auslastung nicht korrekt auslesen. Das gibt das OS einfach nicht her.


RFZ - Mo 02.02.04 14:56

@Luckie
Ich hab doch ein Tool gepostet welches es kann, also muss es auch irgendwie machbar sein ;)

cu RFZ


Delete - Mo 02.02.04 15:03

wer weiß, was das Tool macht. oder gibt es den Source dazu? Man kann es eventuell irgendwie ungefähr errechnen. Fakt ist aber, dass ConsumerWindows keine direkte Möglichkeit bietet sie direkt zu ermitteln mittels einer API.


RFZ - Mo 02.02.04 15:10

leider hab ich zu dem tool absolut keine Info gefunden... Muss ja nicht mit API sein, kann ja auch irgendwie anders funktionieren...


mica - Mo 02.02.04 15:36

@phantom1
Das sieht ja gar nicht mal so schwer aus.
Das versuche ich mal, wenn ich heut nach Hus komm.
Ansonsten, melde ich mich nocheinmal.

Danke und Gruß
Mica


Delete - Mo 02.02.04 19:53

RFZ hat folgendes geschrieben:
leider hab ich zu dem tool absolut keine Info gefunden... Muss ja nicht mit API sein, kann ja auch irgendwie anders funktionieren...

Was gbt es anderes als die API bei Windows? :roll:


RFZ - Mo 02.02.04 20:24

ich hab keine ahnung ;) aber irgendwas muss es ja geben ....


mica - Mo 02.02.04 20:30

@phantom1

:cry:
Hab versucht deinen Quelltext zum laufen zu bringen.
1.) einen timer und ein Image aufs Formular pgepflanzt
2.)Den gesamten Quellcode von dir über meinen Quellcode kopiert
3.)F9

Das compilieren stoppt mit :
-[Fehler] Unit1.pas(36): Undefinierter Bezeichner: 'CollectCPUData'
-[Fehler] Unit1.pas(38): Undefinierter Bezeichner: 'CPULast'
-[Fehler] Unit1.pas(39): Undefinierter Bezeichner: 'GetCPUUsage'
-...

Was mache ich falsch?(Ich benutze Delphi 5)

Gruß
Mica


Phantom1 - Mo 02.02.04 20:33

@mica: hast du die unit adcpuusage in das verzeichniss von der anwendung kopiert?


mica - Mo 02.02.04 21:32

@phantom1
hmm...verstehe ich nicht.

adcpuusage unit ist doch der Quelltext, mit dem du mir geantwortet hast,oder?
ich habe einfach eine neue Anwendung gestartet und dein Quelltext in meine Unit1.pas kopiert.

Davor habe ich natürlich den timer und das image auf Form1 getan.
Hilfe!!!

Gruß
Mica


Phantom1 - Di 03.02.04 00:52

moment, ich seh grad das war ja ein anderer topic von dir, dort hatte ich eine seite gepostet mit einer Unit für die CPU-Last messung und die brauchst du http://tinyurl.com/77j2

diese adcpuusage.pas einfach in deine anwendung kopieren.