Festplatten Auslastung mit OpenHardwareMonitorLib auslesen

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von xChRoNiKx.

    Festplatten Auslastung mit OpenHardwareMonitorLib auslesen

    Hallo, ich möchte ein Programm erstellen das mir die aktuelle Auslastung von einem ausgewähltem Laufwerk in einer ProgressBar ausgibt.
    Mein erster versuch war den quellcode von Luki-Progger genauer seinem Tutorial über OpenHardwareMonitorLib zu verändern sodass es statt die cpu Temperatur, die Festplattenauslastung ausgibt.

    Quellcode

    1. Imports OpenHardwareMonitor.Hardware
    2. Public Class Form1
    3. Dim Computer As New Computer
    4. Private Function GetCoreLoad(ByVal Core As Integer) As String
    5. For Each Hardware In Computer.Hardware
    6. Hardware.Update()
    7. If Hardware.HardwareType = HardwareType.HDD Then
    8. For Each sensor In Hardware.Sensors
    9. If sensor.SensorType = SensorType.Load Then
    10. Return CDbl(sensor.Value)
    11. End If
    12. Next
    13. End If
    14. Next
    15. Return 0
    16. End Function
    17. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    18. For i = 0 To Environment.ProcessorCount - 1
    19. Dim p As Double
    20. Dim x As Double
    21. p = Math.Round(x, 0)
    22. x = GetCoreLoad(i) / 10
    23. Me.Text = "HDD: " & p & " %"
    24. ProgressBar1.Value = p
    25. Next
    26. End Sub
    27. End Class

    Aber da ich den code von OpenHardwareMonitorLib nur grob verstehe finde ich den fehler hier nicht.
    Willkommen im Forum.

    RedCrafter_LP schrieb:

    VB.NET-Quellcode

    1. Private Function GetCoreLoad(ByVal Core As Integer) As String ' <==
    2. For Each Hardware In Computer.Hardware
    3. Hardware.Update()
    4. If Hardware.HardwareType = HardwareType.HDD Then
    5. For Each sensor In Hardware.Sensors
    6. If sensor.SensorType = SensorType.Load Then
    7. Return CDbl(sensor.Value) ' <==
    8. End If
    9. ' ...
    Bevor Du auch nur noch eine einzige Zeile Code schreibst, machst Du Option Strich On :!:
    Visual Studio - Empfohlene Einstellungen
    Ansonsten wunderst Du Dich nämlich, wenn diese Funktion "Roulade mit Klößen" zurückgibt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Der Teil funktioniert in anderen Programmen gut. Solange zahlen im String stransportiert werden gibts ja keine Fehler.Algemein hab ich ja keinen Error, der wert ist nur einfach immer "0". Mein fehler liegt in der verwendung der codestruktur von OpenHardwaremonitorlib . Mann muss irgendwie anders auf die werte von "hdd" zugreifen.
    @RedCrafter_LP Deine Funktion ist vom Typ String, sie gibt jedoch ein Double-Wert zurück.
    Du wirst hier keine qualifizierte Hilfe bekommen, wenn diese elementaren Dinge nicht klar sind!
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Quellcode

    1. Imports OpenHardwareMonitor.Hardware
    2. Public Class Form1
    3. Dim Computer As New Computer
    4. Private Function GetCoreLoad(ByVal Core As Integer) As double
    5. For Each Hardware In Computer.Hardware
    6. Hardware.Update()
    7. If Hardware.HardwareType = HardwareType.HDD Then
    8. For Each sensor In Hardware.Sensors
    9. If sensor.SensorType = SensorType.Load Then
    10. Return CDbl(sensor.Value)
    11. End If
    12. Next
    13. End If
    14. Next
    15. Return 0
    16. End Function
    17. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    18. For i = 0 To Environment.ProcessorCount - 1
    19. Dim p As Double
    20. Dim x As Double
    21. p = Math.Round(x, 0)
    22. x = GetCoreLoad(i) / 10
    23. Me.Text = "HDD: " & p & " %"
    24. ProgressBar1.Value = p
    25. Next
    26. End Sub
    27. End Class

    Auch wenn ich es so schreibe ändert das am ergebnis und am problem nichts.
    Dein Code kann an sich nicht funktionieren.

    In der Beschreibung in deinem Thread steht man muss vorher CPUEnabled / HDDEnabled / GPUEnabled usw auf true setzen wenn man was auslesen will.
    Desweiteren willst du hier "Load" von einer HDD auslesen und mischt das mit einem Timer der für Prozessorkerne ist.

    Fun Fact: Eine Festplatte hat keinen "Load" im Sinne von Auslastung wie der CPU. Zumindest nicht soweit ich das weiß. Ich konnte mit der Lib nun nur den genutzten Speicherplatz meiner SSD´s auslesen
    aber keine Temperatur.

    Hiermit bekomme ich nur "Used Space" zurück. Keine Temperatur keine Ahnung warum keine Temperatur dafür hab ich mich zu wenig mit der Lib auseinander gesetzt.

    VB.NET-Quellcode

    1. Dim Computer As New Computer
    2. Computer.HDDEnabled = True
    3. Computer.Open()
    4. For Each Hardware In Computer.Hardware
    5. Hardware.Update()
    6. For Each Sensor In Hardware.Sensors
    7. Console.WriteLine(Sensor.Name.ToString() + " // " + Sensor.Identifier.ToString() + " // " + Sensor.SensorType.ToString() + " // " + Sensor.Value.ToString())
    8. Next
    9. Next


    Output:

    Quellcode

    1. Used Space // /hdd/0/load/0 // Load // 34,39396
    2. Used Space // /hdd/1/load/0 // Load // 42,75844
    3. Used Space // /hdd/2/load/0 // Load // 42,34811
    4. Used Space // /hdd/3/load/0 // Load // 41,49176


    Klappt bei mir wunderbar und ich bekomme den genutzten Speicherplatz in % zurück.
    Desweiteren kannst du auch einfach per Haltepunkt und richtigem Debugging dir alles anschauen was
    in der Variable Hardware so drin ist oder in Sensor.

    Ich empfehle: Grundlagen üben/lernen das ist hier elementar um überhaupt den Code zu verstehen(scheinst du nicht sonst wäre deine HDD auslese Routine nicht an Prozessorkernen gebunden).
    Dann alles was der @RodFromGermany dir gesagt hat und ganz wichtig seinen Link für die empfohlenen Einstellungen.

    PS: Ich hoffe du ( @RodFromGermany ) erschlägst mich jetzt nicht für den Beispiel Code :)
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    RedCrafter_LP schrieb:

    die aktuelle Auslastung von einem ausgewähltem Laufwerk
    Was soll das sein?
    Der belegte Speicherplatz und der gesamte Speicherplatz?
    Die aktuelle Drehzahl und die maximale Drehzahl?
    Die aktuelle Datenübertragungsrate und die maximale Datenübertragungsrate?
    Für ersteres gibt es die System.IO.DriveInfo-Klasse.
    docs.microsoft.com/de-de/dotne…o?view=netframework-4.7.2
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Mein ziel sind diese werte auszulesen und mir fehlt nur noch der datenträger sorry wenn ich zu undeutlich und ungenau formulierte habe
    Außerdem glaube ich das im taskmgr

    RodFromGermany schrieb:

    Die aktuelle Datenübertragungsrate und die maximale Datenübertragungsrate


    gemeint ist.
    Ps: schonmal danke für eure hilfe bis jetzt

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „RedCrafter_LP“ ()

    Heyho,

    ich sehe keine möglichkeit mit der Lib das zu bekommen.

    Dafür könntest du einen PerformanceCounter nutzen.
    Der kann viele dinge aber vor allem auch verschiedene dinge für Harddisks anzeigen:

    C#-Quellcode

    1. PerformanceCounter("PhysicalDisk", "Avg. Disk Queue Length", "_Total");
    2. PerformanceCounter("PhysicalDisk", "Disk Read Bytes/sec", "_Total");
    3. PerformanceCounter("PhysicalDisk", "Disk Write Bytes/sec", "_Total");
    4. PerformanceCounter("PhysicalDisk", "Avg. Disk sec/Read", "_Total");
    5. PerformanceCounter("PhysicalDisk", "Avg. Disk sec/Write", "_Total");
    6. PerformanceCounter("PhysicalDisk", "% Disk Time", "_Total");
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen