CPU Usage unter PB 4.0

Anfängerfragen zum Programmieren mit PureBasic.
Peter-AC
Beiträge: 10
Registriert: 31.01.2010 22:36

Re: CPU Usage unter PB 4.0

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: CPU Usage unter PB 4.0

Beitrag 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
Peter-AC
Beiträge: 10
Registriert: 31.01.2010 22:36

Re: CPU Usage unter PB 4.0

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: CPU Usage unter PB 4.0

Beitrag 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
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: CPU Usage unter PB 4.0

Beitrag von mk-soft »

Da fehlt das @ (Zeiger) vor den Strings
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: CPU Usage unter PB 4.0

Beitrag 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:
Peter-AC
Beiträge: 10
Registriert: 31.01.2010 22:36

Re: CPU Usage unter PB 4.0

Beitrag 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
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Re: CPU Usage unter PB 4.0

Beitrag 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.
Peter-AC
Beiträge: 10
Registriert: 31.01.2010 22:36

Re: CPU Usage unter PB 4.0

Beitrag von Peter-AC »

Hallo Helle

funzt wunderbar. Vielen Dank.

LG
Peter
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: CPU Usage unter PB 4.0

Beitrag 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
Antworten