Vorrausgesetzt das es so klappt. Geht nämlich nicht immer.ts-soft hat geschrieben:Dann wurden aber immer noch keine Prototypes genutzt und der Code ist im
PureBasic 3.x Kompatibilitätsmodus
CPU Usage unter PB 4.0
Re: CPU Usage unter PB 4.0
- 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
Was geht nicht immer? Prototypes gehen immer! Sind Zukunftssicheral90 hat geschrieben:Vorrausgesetzt das es so klappt. Geht nämlich nicht immer.
erweiterte Möglichkeiten (Pseudotypes).
Gruß
Thomas
Re: CPU Usage unter PB 4.0
Ne ich meine das mit "@" bei CallFunction. Prototype schön und gut. Aber meiner meinung nachts-soft hat geschrieben:Was geht nicht immer? Prototypes gehen immer! Sind Zukunftssicherund bieten
erweiterte Möglichkeiten (Pseudotypes).
verliert PB damit wieder ein bischen den Begriff Basic. Prototypes sind eben mal
kmplizierter handzuhaben als CallFunction.
- 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
Kommt drauf an, mit welchem Basic Du vergleichstal90 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.
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
Und genau das macht es schon komplizierter als bei CallFunction.ts-soft hat geschrieben:...und kompliziert ist da eigentlich garnichts, nur etwas mehr Schreibaufwand
Re: CPU Usage unter PB 4.0
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:
Gruß
Helle
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
Helle
Re: CPU Usage unter PB 4.0
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
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
Hallöchen.
Bei mir der gleiche Fehler (win7, 64bit). CPU = Intel 8400 (DualCore)
Bei mir der gleiche Fehler (win7, 64bit). CPU = Intel 8400 (DualCore)
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Re: CPU Usage unter PB 4.0
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.
Gruß
Helle
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
Helle
Re: CPU Usage unter PB 4.0
Hallo Klaus.
Tut mir leid, läuft nicht.
Tut mir leid, läuft nicht.
das Gleiche für Core1...Aufruf von PdhVbAddCounter für Core0" fehlgeschlagen!
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de