Label.Text wird nicht übernommen

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Schrotti555.

    Label.Text wird nicht übernommen

    Hallo zusammen,
    ich hab mal wieder ein Problem...
    ich möchte mir einen kleinen SystemMonitor zusammenbasteln :) und habe folgendes Problem...

    Der Code ist noch ganz einfach aber irgendwie wird der Text des CoreLabels nicht aktualisiert wenn der Timer tick kommt...
    Das Label wird nur einmalig beschrieben und dann nie wieder...??? Beim Debug wird der

    Hoffe ihr könnt mir helfen
    Danke


    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO
    3. Imports System.Environment
    4. Public Class Form1
    5. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    6. Dim Core As Integer
    7. For Core = 0 To Environment.ProcessorCount - 1 Step 1
    8. Dim CoreLable As New Label
    9. With CoreLable
    10. .Name = "CoreLable_" & Core.ToString
    11. .Height = 20
    12. .Width = 120
    13. .BackColor = Color.Beige
    14. .Location = New System.Drawing.Point(20, 20 + (Core * 25))
    15. End With
    16. Me.Controls.Add(CoreLable)
    17. Next
    18. End Sub
    19. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    20. Dim Core As Integer
    21. For Core = 0 To Environment.ProcessorCount - 1 Step 1
    22. Dim CoreCounter = New PerformanceCounter("Processor", "% Processor Time", Core.ToString)
    23. Me.Controls("CoreLable_" & Core.ToString).Text = "Core #" & Core.ToString & " Usage " & CInt(CoreCounter.NextValue()).ToString & "%"
    24. Next
    25. End Sub
    26. End Class
    Ja Timer wurde gestartet :)

    Hab jetzt schon rausgefunden das es nicht am am Label liegt sondern an dem PerformanceCounter...

    Wenn ich das Debuge

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    2. Dim Core As Integer
    3. Dim Usage As Integer
    4. For Core = 0 To Environment.ProcessorCount - 1 Step 1
    5. Dim CoreCounter = New PerformanceCounter("Processor", "% Processor Time", Core.ToString)
    6. Usage = CInt(CoreCounter.NextValue())
    7. Me.Controls("CoreLable_" & Core.ToString).Text = "Core #" & Core.ToString & " Usage " & Usage.ToString & "%"
    8. Next
    9. End Sub


    dann ist Usage = 0
    und CInt(CoreCounter.NextValue()) = irgendwas zwischen 0 und 100 (je nach Last)

    da passt doch was nicht ?( ?( ?(
    Warum löst Du das Ganze nicht einfach sauber mit einem UserControl?

    Beispiel:

    Code UserControl

    VB.NET-Quellcode

    1. Public Class CPUCounter
    2. Private _perCounter As PerformanceCounter
    3. Public Sub New(ByVal instanceName As String)
    4. InitializeComponent()
    5. _perCounter = New PerformanceCounter("Prozessor", "Prozessorzeit (%)", instanceName)
    6. Me.Label1.Text = "CPU" & instanceName
    7. CallValue()
    8. End Sub
    9. Public Sub CallValue()
    10. Dim value As Integer = Convert.ToInt32(_perCounter.NextValue())
    11. Me.Label2.Text = value.ToString("N0") & "%"
    12. Me.ProgressBar1.Value = value
    13. End Sub
    14. End Class


    Code Form:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents _t As New Timer
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. For i As Integer = 0 To Environment.ProcessorCount - 1
    5. Dim cC As New CPUCounter(i.ToString())
    6. Me.FlowLayoutPanel1.Controls.Add(cC)
    7. Next
    8. _t.Interval = 1000
    9. _t.Start()
    10. End Sub
    11. Private Sub _t_Tick(sender As Object, e As EventArgs) Handles _t.Tick
    12. For Each cC As CPUCounter In Me.FlowLayoutPanel1.Controls.OfType(Of CPUCounter)()
    13. cC.CallValue()
    14. Next
    15. End Sub
    16. End Class
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Habe spaßhalber mal näher angeschaut. Habe die Counters global in der Klasse definiert

    VB.NET-Quellcode

    1. Public Class MainForm
    2. Private _counters(Environment.ProcessorCount - 1) As PerformanceCounter
    3. Private Sub MainForm_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    4. For index = 0 To Environment.ProcessorCount - 1
    5. _counters(index) = New PerformanceCounter("Processor", "% Processor Time", index.ToString)
    6. Dim lbl As New Label
    7. With lbl
    8. .Name = "ProcessorCounterLabel" & index.ToString
    9. .Height = 14
    10. .Width = 125
    11. .BackColor = Color.Black
    12. .ForeColor = Color.Yellow
    13. .Location = New Point(20, 20 + index * 25)
    14. End With
    15. Me.Controls.Add(lbl)
    16. Next
    17. Me.PerformanceCounterTimer.Interval = 500
    18. Me.PerformanceCounterTimer.Enabled = True
    19. End Sub
    20. Private Sub PerformanceCounterTimer_Tick(sender As System.Object, e As System.EventArgs) Handles PerformanceCounterTimer.Tick
    21. For index = 0 To _counters.Length - 1
    22. Dim counter = _counters(index)
    23. Dim lbl = DirectCast(Me.Controls("ProcessorCounterLabel" & index.ToString), Label)
    24. lbl.Text = String.Format("CPU #{0}, Usage: {1}", index, (counter.NextValue / 100).ToString("P"))
    25. Next
    26. End Sub
    27. End Class