Die Community zu .NET und Classic VB.
Menü

Klasse: PDHVB - Performance Counter auslesen

 von 

PDHVB - Performance Counter auslesen  

Diese Klassen samt Beispielprojekt kapseln die Mehrzahl der Funktionen der in der MSDN als PDH-Funktionen für Visual Basic bekannten WinAPI-Funktionen. Dieses sind im Kern alles Funktionen, welche den Präfix 'PdhVB' tragen.

Mit den vorliegenden Klasse ist es möglich, Performance Counter auszulesen. Performance Counter sind Zähler zu verschiedenen Systemwerten. In Microsoft Windows kennt der gemeine Anwender diese durch den Systemmonitor (bzw. perfmon.msc und Windows XP). Hier ablesbare Werte sind etwa die Prozessorauslastung, die Anzahl der Interrupts/sek u.Ä.

Die vorliegende Klassen ermöglichen zum einen die Anzeige des Systemdialoges zur Auswahl der Performance Counter und die Ermittlung der ausgewählten Performance Counter und zum Anderen das Abfragen des Wertes eines Performance Counters.

Das Beispielprojekt zeigt z.B. die Prozessorauslastung an. Achtung, die Anzeige der Prozessorauslastung im Beispielprojekt funktioniert nur auf deutschsprachigen Windowssystemen.


Abbildung 1: Screenshot

Die Zipdatei enthält auch ein Beispielprojekt

Geschrieben wurde die Klasse von

Download cPDHVB.zip [3090 Bytes]

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 2 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von piper am 26.01.2010 um 21:29


ehhm, was ich noch vergessen habe: Das Sprachproblem lässt sich lösen, wenn man mit dem Index (API PdhLookupPerfNameByIndex) arbeitet. Dann würde auch das Beispielprojekt funzen. :) Beispiel CPU:

Dim NameLen As Long
Dim ObjectName As String, CounterName As String

NameLen = 260
ObjectName = Space$(NameLen) ''Processor
PdhLookupPerfNameByIndex ByVal vbNullString, 238, ObjectName, NameLen
ObjectName = Left$(ObjectName, NameLen - 1)

NameLen = 260
CounterName = Space$(NameLen) '% Processor Time
PdhLookupPerfNameByIndex ByVal vbNullString, 6, CounterName, NameLen
GetCPUCounter = "\" & ObjectName & "(" & CStr(Instance) & ")\" & Left$(CounterName, NameLen - 1) '\Processor(0)\% Processor Time

Kommentar von piper am 26.01.2010 um 19:25

Hi
Thanks für den Code.
Habe eine Lösung, wie man die Counter-Indizes und Namen herausbekommt. Ungeheuer: habe hier mal 1024 Items gelistet; wieviele es gibt, weiss ich nicht. Vermutlich kann man auch den Kartoffelpreis in Timbuktu abfragen...
:-)

Private Declare Sub PdhLookupPerfNameByIndex Lib "PDH.DLL" Alias "PdhLookupPerfNameByIndexA" (ByVal szMachineName As String, _
ByVal dwNameIndex As Long, ByVal szNameBuffer As String, ByRef pcchNameBufferSize As Long)


Public Sub GetPDH_PerfCounterNames()
Dim sBuf As String, sLen&, i%, Tx$, Itm$

For i = 0 To 1024
sLen = 260
sBuf = String(sLen, vbNullChar)

PdhLookupPerfNameByIndex vbNullString, i, sBuf, sLen

If sLen > 0 Then
Itm = Left(sBuf, InStr(sBuf, vbNullChar) - 1)
If Len(Itm) > 0 Then Tx = Tx & i & " " & Itm & vbCrLf
End If
Next
DispString Tx, "PDH_PerfCounterNames.txt"
End Sub

'Show TextFile using NotePad
'Display a big String using NotePad. If not specified, use an internal FileName @ App.Path.
'Ask to kill it after Display and close by user.
Public Sub DispString(Tx$, Optional ByVal FileNm$ = "")
Const NtPd = "Notepad "
Dim hFile%: hFile = FreeFile
If FileNm = "" Then FileNm = CurDir & "\Tmp.txt" 'Default
Open FileNm For Output As #hFile
Print #hFile, Tx
Print #hFile, "Done; Written at: " & Now
Close #hFile
Shell NtPd & FileNm, vbNormalFocus
If MsgBox("Deleting DisplayFile " & FileNm & " after close? (recommended)", _
vbYesNo + vbQuestion, FileNm) = vbYes Then Kill FileNm
End Sub