CPU Usage unter PB 4.0

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Re: CPU Usage unter PB 4.0

Beitrag von Helle »

Hmm, könnte es sein, das Du Unicode verwendest? Der Proz$ ist da sehr pingelig, deshalb hier eine Variante, die auch mit Unicode funktioniert:

Code: Alles auswählen

;- CPU-Auslastung-Ermittlung mit der PDH.DLL für 64-Bit-Windows
;- "Helle" Klaus Helbing, 29.09.2010, PB4.51 (x64)
;- Unicode-Variante (deutsches Windows)

If OpenLibrary(0, "PDH.DLL")                     ;MS-File in \System32
  SI.SYSTEM_INFO
  #PDH_CSTATUS_NEW_DATA = $1
 
  GetSystemInfo_(@SI)                            ;Anzahl der Cores ermitteln
  AnzCore.l = SI\dwNumberOfProcessors
  Buffer.q = AllocateMemory(8 * AnzCore)
  CoreLast.d
  hQuery.l
 
  Prototype.l ProtoOpenQuery(Para1.l)
  Prototype.l ProtoCloseQuery(Para1.l)
  Prototype.l ProtoCollectData(Para1.l)
  Prototype.d ProtoAuslastung(Para1.l, Para2.l)
  Prototype.l ProtoAddCounter(Para1.l, Para2.q, Para3.q)

  OpenQuery.ProtoOpenQuery = GetFunction(0, "PdhVbOpenQuery")
  CloseQuery.ProtoCloseQuery = GetFunction(0, "PdhCloseQuery")  ;sicherer, Server 2003 kennt PdhVbCloseQuery nicht (Win 7 ja)           
  CollectData.ProtoCollectData = GetFunction(0, "PdhCollectQueryData")
  AddCounter.ProtoAddCounter = GetFunction(0, "PdhVbAddCounter")
  Auslastung.ProtoAuslastung = GetFunction(0, "PdhVbGetDoubleCounterValue")
 
  RetVal = OpenQuery(@hQuery)
  If RetVal
    MessageRequester("Fehler !", "Aufruf von PdhVbOpenQuery fehlgeschlagen!") 
    End
  EndIf
 
  For i = 0 To AnzCore - 1
    PokeB(?Proz + 11, 48 + i)                    ;Core-Nr. ändern
    RetVal = AddCounter(hQuery, ?Proz, Buffer + (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 AnzCore - 1
      Auslastung(PeekL(Buffer + (4 * i)), PeekL(Buffer + (4 * AnzCore) + (i << 2)))
      !movsd [v_CoreLast],xmm0                   ;Float-/Double-Rückgabewert in XMM0! MOVSD sieht eleganter aus
      Auslastung$ + "Auslastung Core" + Str(i) + " = " + StrD(CoreLast, 2) + "%" + Space(20)
      If PeekL(Buffer + (4 * AnzCore) + (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

DataSection
  Proz:                                          ;ist der alte Proz$  
  Data.b 92,80,114,111,122,101,115,115,111,114,40,48,41,92,80,114,111,122,101,115,115,111,114,122,101,105,116,32,40,37,41,0
EndDataSection
Ansonsten mal den Rückgabe-Wert anzeigen lassen; der gibt dann mehr Aufschluss.
Gruß
Helle
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Re: CPU Usage unter PB 4.0

Beitrag von Agent »

Hallo.

Leider nix. Übrigens, ja: Win7 x64 (wie oben geschrieben).

Fehler jetzt
Aufruf von PdhVbAddCounter für Core0 fehlgeschlagen
Dann auch für Core1.
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Antworten