Seite 4 von 5

Re: CPU Usage unter PB 4.0

Verfasst: 04.02.2010 20:47
von al90
ts-soft hat geschrieben:Dann wurden aber immer noch keine Prototypes genutzt und der Code ist im
PureBasic 3.x Kompatibilitätsmodus :mrgreen:
Vorrausgesetzt das es so klappt. Geht nämlich nicht immer. /:->

Re: CPU Usage unter PB 4.0

Verfasst: 04.02.2010 20:55
von ts-soft
al90 hat geschrieben:Vorrausgesetzt das es so klappt. Geht nämlich nicht immer. /:->
Was geht nicht immer? Prototypes gehen immer! Sind Zukunftssicher :mrgreen: und bieten
erweiterte Möglichkeiten (Pseudotypes).

Gruß
Thomas

Re: CPU Usage unter PB 4.0

Verfasst: 04.02.2010 21:02
von al90
ts-soft hat geschrieben:Was geht nicht immer? Prototypes gehen immer! Sind Zukunftssicher :mrgreen: und bieten
erweiterte Möglichkeiten (Pseudotypes).
Ne ich meine das mit "@" bei CallFunction. Prototype schön und gut. Aber meiner meinung nach
verliert PB damit wieder ein bischen den Begriff Basic. Prototypes sind eben mal
kmplizierter handzuhaben als CallFunction. :wink:

Re: CPU Usage unter PB 4.0

Verfasst: 04.02.2010 21:15
von ts-soft
al90 hat geschrieben:Prototype schön und gut. Aber meiner meinung nach
verliert PB damit wieder ein bischen den Begriff Basic. Prototypes sind eben mal
kmplizierter handzuhaben als CallFunction. :wink:
Kommt drauf an, mit welchem Basic Du vergleichst :wink:
Visual Basic hat bereits seit Generationen das Declare, welches prinzipiell den Prototypes entspricht
und kompliziert ist da eigentlich garnichts, nur etwas mehr Schreibaufwand :)

Re: CPU Usage unter PB 4.0

Verfasst: 04.02.2010 21:31
von al90
ts-soft hat geschrieben:...und kompliziert ist da eigentlich garnichts, nur etwas mehr Schreibaufwand :)
Und genau das macht es schon komplizierter als bei CallFunction. :)

Re: CPU Usage unter PB 4.0

Verfasst: 05.02.2010 18:20
von Helle
Ich denke schon, dass TS auf dem richtigen Dampfer ist. Wir werden in PB nicht um Prototypes herumkommen. Eine einheitliche Aufruf-Konvention wiegt den zusätzlichen Schreibaufwand sicher auf. Damit meine ich auch die "direkten" API-Aufrufe (also "Funktion_(...)"), die dann ebenfalls über Prototype wieder Basic-like verwendet (aufgerufen) werden können. Als passendes Beispiel mein obiges Progrämmchen, in dem die Verwendung von Prototypes und gleichzeitig Direkt-API ("GetSystemInfo_(@SI)") ziemlich bescheuert aussieht. Deshalb hier ein Beispiel nur mit Prototypes:

Code: Alles auswählen

;- CPU-Auslastung-Ermittlung mit der PDH.DLL, auch für Multi-Core-CPU´s 
;- Version mit Prototypen ohne direkten API-Aufruf. Der Programmierer muss aber wissen/angeben, in welcher DLL sich die benötigte Funktion befindet! 
;- W2k, WXP, Vista(?) 
;- "Helle" Klaus Helbing, 05.02.2010, PB4.41 (x86), 32-Bit-Windows
;- Soll nur schmucklos die einfache Machbarkeit zeigen! 

If OpenLibrary(0, "PDH.DLL") And OpenLibrary(1, "Kernel32.DLL") ;MS-Files in \System32   na ja, Kernel32 ist wohl klar   
  SI.SYSTEM_INFO
  #PDH_CSTATUS_NEW_DATA = $1
  
  Core = AllocateMemory(64)                                 ;hier für max. 4 Cores, 0-15=Counter, 16-31=PdhStatus, 32-63=dblValue    oder Structure (besser, hier aber nicht von Belang)
  
  Prototype.l ProtoOpenQuery(Para1.l, Para2.l, Para3.l)    ;"Para..." kann (sollte) durch aussagekräftige Ausdrücke ersetzt werden, hier mal geschenkt  
  Prototype.l ProtoCloseQuery(Para1.l)
  Prototype.l ProtoCollectData(Para1.l)
  Prototype.d ProtoAuslastung(Para1.l, Para2.l)
  Prototype.l ProtoAddCounter(Para1.l, Para2.s, Para3.l)   ;Para2 gleich als String ist natürlich wesentlich sinnvoller (von TS) 
  Prototype.l ProtoSystemInfo(Para1.l)                     ;hier neu

  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")
  GetSystemInfo.ProtoSystemInfo = GetFunction(1, "GetSystemInfo")    ;hier neu, Kernel32.DLL ! 

  RetVal = OpenQuery(0, 1, @hQuery)                   
  If RetVal
    MessageRequester("Fehler !", "Aufruf von PdhOpenQuery fehlgeschlagen!")  
    End
  EndIf

  GetSystemInfo(@SI)                                       ;Anzahl der Cores ermitteln   hier über Prototype! Man beachte den fehlenden Unterstrich!

  For i = 0 To SI\dwNumberOfProcessors - 1
    RetVal = AddCounter(hQuery, "\Prozessor(" + Str(i) + ")\Prozessorzeit (%)", 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 + (i << 2)), 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. oder/und Test auf gültige Daten 
        Auslastung$ = "???"                                     ;war kein gültiger Wert; oder richtige (Core-bezogene) Auswertung, wie es gerade nötig ist
        Break 
      EndIf     
    Next 
    Debug Auslastung$
    Delay(500)
  ForEver 

  CloseQuery(@hQuery)
  CloseLibrary(0) : CloseLibrary(1)
EndIf
Gruß
Helle

Re: CPU Usage unter PB 4.0

Verfasst: 05.02.2010 22:14
von Peter-AC
Hallo Helle

Dein letztes Beispiel läuft wiederum bei mir nicht. Es kommt die Fehlermeldung

Aufruf von PdhVbAddCounter für Core 0 fehlgeschlagen!
Aufruf von PdhVbAddCounter für Core 1 fehlgeschlagen!

Danach im Debugfenster fortlaufen Auslastung 0,00 %

LG
Peter

Re: CPU Usage unter PB 4.0

Verfasst: 22.09.2010 22:05
von Agent
Hallöchen.

Bei mir der gleiche Fehler (win7, 64bit). CPU = Intel 8400 (DualCore)

Re: CPU Usage unter PB 4.0

Verfasst: 24.09.2010 10:02
von Helle
Huch! Habe hier zufällig mal reingeschaut und sehe unzufriedene Kunden :mrgreen:. Also: Die Fehlermeldung von Peter-AC kann als Ursache (wenn DLL vorhanden) ein nicht-deutsches Windows sein; Proz$ ist sprachabhängig (s.Code unten). Für ein 64-Bit-Windows habe ich eben mal nachfolgenden Code gebastelt. Irgendwie scheint PB nicht zu realisieren, das der Rückgabe-Wert ein Double ist (oder ich habe falsch deklariert!?). Deshalb der "Trick" mittels ASM.

Code: Alles auswählen

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

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, "PdhVbCloseQuery")
  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
    Proz$ = "\Prozessor(" + Str(i) + ")\Prozessorzeit (%)" ;für englisches Windows: "\Processor(" + Str(i) + ")\% Processor Time"
    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)))
      !movlpd [v_CoreLast],xmm0                  ;Float-/Double-Rückgabewert in XMM0!
      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
Gruß
Helle

Re: CPU Usage unter PB 4.0

Verfasst: 29.09.2010 16:49
von Agent
Hallo Klaus.

Tut mir leid, läuft nicht.
Aufruf von PdhVbAddCounter für Core0" fehlgeschlagen!
das Gleiche für Core1...