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

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
Was geht nicht immer? Prototypes gehen immer! Sind Zukunftssicheral90 hat geschrieben:Vorrausgesetzt das es so klappt. Geht nämlich nicht immer.
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).
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.
Und genau das macht es schon komplizierter als bei CallFunction.ts-soft hat geschrieben:...und kompliziert ist da eigentlich garnichts, nur etwas mehr Schreibaufwand
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
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
das Gleiche für Core1...Aufruf von PdhVbAddCounter für Core0" fehlgeschlagen!