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

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

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.

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.

Kommt drauf an, mit welchem Basic Du vergleichst
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

. 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...