Seite 3 von 5

Re: CPU Usage unter PB 4.0

Verfasst: 03.02.2010 19:10
von Peter-AC
Hallo

mit PB 4.40 kriege ich bei der Zeile
RetVal = CallFunction(0, "PdhVbAddCounter", hQuery, "\Prozessor("+ Str(i) +")\Prozessorzeit (%)", Core+4*i) ;Counter
den Fehler: Falscher Parametertyp. Zahl anstelle eines Strings erwartet

Liegt das an der PB Version, oder muss ich da noch was einbinden?

LG
Peter

Re: CPU Usage unter PB 4.0

Verfasst: 03.02.2010 19:35
von ts-soft
Peter-AC hat geschrieben:Liegt das an der PB Version, oder muss ich da noch was einbinden?

LG
Peter
Liegt an der PB Version
Geschichte PB 4.41 hat geschrieben:- Geändert: Call(C)Function(Fast) Parameter wurden geändert von 'Any' in 'Integer'.
Ansonsten sollte man sowieso seit PB 4.0 besser mit Prototypes arbeiten!

Gruß
Thomas

Re: CPU Usage unter PB 4.0

Verfasst: 03.02.2010 20:02
von Peter-AC
Hallo Thomas

funzt leider garnicht.
Wenn ich den Befehl so ändere:
RetVal = CallFunction(0, "PdhVbAddCounter", hQuery, Core+4*i) ;Counter
dann kann ich das Programm zwar zu einer EXE umwandeln, bekomme aber zur Laufzeit den Fehler Funktion gescheitert. Mit Debugger schmiert es mir bei Read Icon ab.
Da ich Anfänger in PB bin, überfordert mich dein Beispiel leider. Schade.

LG
Peter

Re: CPU Usage unter PB 4.0

Verfasst: 03.02.2010 20:20
von ts-soft
Da ich den Code, den Du verwendest, nicht kenne, bzw. Du nur einen kleinen Auszug gepostet hast
und ich keine Lust habe, diesen Code zu suchen, kann ich Dir auch nicht vernünftig weiterhelfen.

Das anpassen des CallFunction statt der Nutzung von Prototypes lehne ich jedenfalls ab. Ohne
Code oder Link zum Code, bzw. erforderlicher DLL o. ä. kann ich nichts machen.

Gruß
Thomas

Re: CPU Usage unter PB 4.0

Verfasst: 03.02.2010 21:12
von mk-soft
Da fehlt das @ (Zeiger) vor den Strings

Re: CPU Usage unter PB 4.0

Verfasst: 03.02.2010 22:16
von ts-soft
mk-soft hat geschrieben:Da fehlt das @ (Zeiger) vor den Strings
Dann wurden aber immer noch keine Prototypes genutzt und der Code ist im
PureBasic 3.x Kompatibilitätsmodus :mrgreen:

Re: CPU Usage unter PB 4.0

Verfasst: 03.02.2010 23:05
von Peter-AC
ts-soft hat geschrieben:Da ich den Code, den Du verwendest, nicht kenne, bzw. Du nur einen kleinen Auszug gepostet hast
und ich keine Lust habe, diesen Code zu suchen, kann ich Dir auch nicht vernünftig weiterhelfen.

Das anpassen des CallFunction statt der Nutzung von Prototypes lehne ich jedenfalls ab. Ohne
Code oder Link zum Code, bzw. erforderlicher DLL o. ä. kann ich nichts machen.

Gruß
Thomas
Hallo Thomas

es ist das Beispiel von Helle
LG
Peter

Code: Alles auswählen

;- CPU-Auslastung-Ermittlung mit der PDH.DLL, Anzeige-Beispiel für 2 Cores
;- W2k, WXP, Vista(?)
;- "Helle" Klaus Helbing, 24.03.2008, PB4.10

Global hQuery.l
Global RetVal.l
Global Core.l
Global SI.SYSTEM_INFO
Global IData.b

;#PDH_CSTATUS_VALID_DATA = $0
#PDH_CSTATUS_NEW_DATA = $1

OpenWindow(0, 0, 0, 0, 0, "", #PB_Window_SystemMenu | #PB_Window_Invisible)    ;Window nicht anzeigen

;ich mag keine Structuren...
Core = AllocateMemory(332)             ;für max. 4 Cores, 0-15=Counter, 16-31=PdhStatus, 32-63=dblValue

;-------- Alle Daten für Icon einlesen
Restore IconData
For x = 64 To 331
  Read IData
  PokeB(Core + x , IData)
Next x
;-------- 

;-------- Erstmal ein Icon anzeigen
Icon = CatchImage(0, Core + 64)      ;Art und Grösse des Images werden aus den Header-Daten ermittelt
AddSysTrayIcon(0, WindowID(0), Icon)
;--------

Prototype.d ProtoValue(Para1.l, Para2.l)    ;CallFunction geht nicht wegen Double-Rückgabewert!

If OpenLibrary(0, "PDH.DLL")           ;MS-File in \System32
  RetVal = CallFunction(0, "PdhOpenQuery", 0, 1, @hQuery)
  If RetVal
    MessageRequester("Fehler !", "Aufruf von PdhOpenQuery fehlgeschlagen!") 
  EndIf

  GetSystemInfo_(@SI)                  ;Anzahl der Cores ermittlen

  For i=0 To SI\dwNumberOfProcessors - 1
    RetVal = CallFunction(0, "PdhVbAddCounter", hQuery, "\Prozessor("+ Str(i) +")\Prozessorzeit (%)", Core+4*i)   ;Counter
    If RetVal
      MessageRequester("Fehler !", "Aufruf von PdhVbAddCounter für Core"+ Str(i) +" fehlgeschlagen!") 
    EndIf
  Next
 
  Repeat
    CallFunction(0, "PdhCollectQueryData", hQuery)
    Auslastung$=""
    Value.ProtoValue = GetFunction(0, "PdhVbGetDoubleCounterValue")
    For i=0 To SI\dwNumberOfProcessors - 1  ;Anzeige: Core0 oben, Core1 unten
      A.l=i<<3
      B.d=Core+32+A                    ;dblValue
      B = Value(PeekL(Core+4*i), Core+16+i<<2)
      B$ = StrD(B, 0)
;Auslastung$ + "Auslastung Core" + Str(i)+" = "+ StrD(B, 0) + "%" + Space(20)   

      If B$ = "100"
        B$ = "99"                      ;Anzeige nur zweistellig, 99 ist also auch 100
      EndIf
     
      B$=RSet(B$, 2, "0")              ;führende Null bei einstelligem Wert
         
      If PeekL(Core+16+i<<2) > #PDH_CSTATUS_NEW_DATA  ;s.o.
        A = -1                         ;war kein gültiger Wert
        Break
       Else
        E = Val(Right(B$, 1))
        For x = 0 To 6                 ;Einer-Werte     
          PokeB(Core + 235-36*i + (x << 2) , PeekB(Core + 262 + (E * 7) + x))
        Next x
         
        Z = Val(Left(B$, 1))
        For x = 0 To 6                 ;Zehner-Werte
          PokeB(Core + 234-36*i + (x << 2) , PeekB(Core + 262 + (Z * 7) + x))
        Next x
     
        Icon = CatchImage(0, Core + 64)
        ChangeSysTrayIcon(0, Icon)       
      EndIf     
    Next
;Debug Auslastung$
    Delay(500)
    Event = WindowEvent()
   
    If Event = #PB_Event_SysTray         ;Geduld, Abfrage-Anzeige kann mehrere Sekunden dauern!
      If EventType() = #PB_EventType_LeftDoubleClick
        Abfrage = MessageRequester("Intel-Core-Duo-Temperaturanzeige", Space(26) + "Beenden ?", #PB_MessageRequester_YesNo)
        If Abfrage = #PB_MessageRequester_Yes     
          CloseWindow(0)
          End
        EndIf 
      EndIf
    EndIf
 
  Until Event = #PB_Event_CloseWindow

  CallFunction(0, "PdhCloseQuery", hQuery)
  CloseLibrary(0)
EndIf

;-------------------------------------------------------------------------------------------------- 
DataSection
;-------- Header eines 16x16-Icons mit 2 "Farben", bleibt konstant
IconData:
  Data.b  0, 0, 1, 0, 1, 0, 16, 16, 2, 0 ,0 ,0, 0, 0, 176, 0 
  Data.b  0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 16, 0, 0, 0, 32, 0
  Data.b  0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0
  Data.b  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b  0, 0, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b  0, 0, 0, 0, 0, 0
;-------- Ab hier den "Rest" der Icon-Datei mit Null auffüllen, nimmt dann die Bit-Muster
;-------- der Ziffern auf bzw. füllt den Abstand zwischen obere und untere Ziffern (255) aus
;-------- Auffüllen mit Null, weil die Ziffern-Werte durch Null-Words getrennt werden 
  Data.b  0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b  0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  Data.b  0, 0, 0, 0, 0, 0
;-------- Bit-Muster der Ziffern 0 bis 9   
  Data.b  195, 189, 189, 189, 189, 189, 195    ;Ziffer 0
  Data.b  227, 247, 247, 247, 247, 199, 231    ;Ziffer 1
  Data.b  193, 191, 191, 193, 253, 253, 131    ;Ziffer 2
  Data.b  131, 253, 253, 195, 253, 253, 131    ;Ziffer 3
  Data.b  247, 247, 247, 129, 183, 183, 191    ;Ziffer 4   
  Data.b  131, 253, 253, 131, 191, 191, 129    ;Ziffer 5
  Data.b  195, 189, 189, 131, 191, 191, 195    ;Ziffer 6
  Data.b  239, 247, 247, 251, 253, 189, 129    ;Ziffer 7
  Data.b  195, 189, 189, 195, 189, 189, 195    ;Ziffer 8
  Data.b  195, 253, 253, 193, 189, 189, 195    ;Ziffer 9
EndDataSection

Re: CPU Usage unter PB 4.0

Verfasst: 03.02.2010 23:25
von Helle
Hier die Simple-Version mal mit Prototypes (32-Bit-Windows):

Code: Alles auswählen

;- CPU-Auslastung-Ermittlung mit der PDH.DLL, auch für Multi-Core-CPU´s 
;- Version mit Prototypen
;- W2k, WXP, Vista(?) 
;- "Helle" Klaus Helbing, 03.02.2010, PB4.41 (x86), 32-Bit-Windows
;- Soll nur schmucklos die einfache Machbarkeit zeigen! 

If OpenLibrary(0, "PDH.DLL")                          ;MS-File in \System32 
  SI.SYSTEM_INFO
  #PDH_CSTATUS_NEW_DATA = $1
  
  Core = AllocateMemory(64)                           ;für max. 4 Cores, 0-15=Counter, 16-31=PdhStatus, 32-63=dblValue    oder Structure
  
  Prototype.l ProtoOpenQuery(Para1.l, Para2.l, Para3.l)
  Prototype.l ProtoCloseQuery(Para1.l)
  Prototype.l ProtoCollectData(Para1.l)
  Prototype.d ProtoAuslastung(Para1.l, Para2.l)       ;hier wegen Double wirklich notwendig
  Prototype.l ProtoAddCounter(Para1.l, Para2.l, Para3.l)

  OpenQuery.ProtoOpenQuery = GetFunction(0, "PdhOpenQuery")
  CloseQuery.ProtoCloseQuery = GetFunction(0, "PdhCloseQuery")
  CollectData.ProtoCollectData = GetFunction(0, "PdhCollectQueryData")
  AddCounter.ProtoAddCounter = GetFunction(0, "PdhVbAddCounter")
  Auslastung.ProtoAuslastung = GetFunction(0, "PdhVbGetDoubleCounterValue")
  
  RetVal = OpenQuery(0, 1, @hQuery)
  If RetVal
    MessageRequester("Fehler !", "Aufruf von PdhOpenQuery fehlgeschlagen!")  
    End
  EndIf
 
  GetSystemInfo_(@SI)                                 ;Anzahl der Cores ermitteln
 
  For i = 0 To SI\dwNumberOfProcessors - 1
    Proz$ = "\Prozessor(" + Str(i) + ")\Prozessorzeit (%)"
    RetVal = AddCounter(hQuery, @Proz$, Core + (i << 2))
    If RetVal
      MessageRequester("Fehler !", "Aufruf von PdhVbAddCounter für Core"+ Str(i) + " fehlgeschlagen!")  
    EndIf
  Next  
    
  Repeat 
    CollectData(hQuery)  
    Auslastung$ = ""
    For i = 0 To SI\dwNumberOfProcessors - 1
      CoreLast.d = Auslastung(PeekL(Core + 4 * i), Core + 16 + (i << 2))
      Auslastung$ + "Auslastung Core" + Str(i) + " = " + StrD(CoreLast, 2) + "%" + Space(20)
      If PeekL(Core + 16 + (i << 2)) > #PDH_CSTATUS_NEW_DATA    ;s.o.
        A = -1                                        ;war kein gültiger Wert
        Break
      EndIf     
    Next 
    If A <> -1
      Debug Auslastung$
    EndIf
    Delay(500)
  ForEver 

  CloseQuery(@hQuery)
  CloseLibrary(0)
EndIf
Die Ziffern-Anzeige (eh nur für 2 Cores in meinem Beispiel) sollte weiterhin funzen.

Gruß
Helle

P.S.:In obigen Beispielen Unnützes entfernt und Text richtiggestellt.

Re: CPU Usage unter PB 4.0

Verfasst: 04.02.2010 00:21
von Peter-AC
Hallo Helle

funzt wunderbar. Vielen Dank.

LG
Peter

Re: CPU Usage unter PB 4.0

Verfasst: 04.02.2010 01:56
von ts-soft
Jetzt hätte man aber auch beim Prototyp ProtoAddCounter, den zweiten Parameter als String definieren
können :D .

Aber sieht doch viel besser mit Prototypes aus :allright:

Gruß
Thomas