Eigener Thread oder Backgroundworker

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von OneWorld.

    Eigener Thread oder Backgroundworker

    Guten Tag,

    Ich habe eine Frage zu meinem aktuellen Projekt, und zwar habe ich gestern folgenden Code geschrieben, um die CPU Auslastung zu ermitteln. Nun wollte ich fragen ob es sinnvoller wäre diesen Code in einen Backgroundworker oder in einem eigenem Thread laufen zu lassen, um die GUI zu schonen, da ja noch ein paar mehr Funktionen hinzugefügt werden sollten.

    Hier mal der Code:

    VB.NET-Quellcode

    1. Private Sub CPUPerformance()
    2. Dim K1 = CPUK1.NextValue 'CPUK sind die Performancecounter'
    3. Dim K2 = CPUK2.NextValue
    4. Dim K3 = CPUK3.NextValue
    5. Dim K4 = CPUK4.NextValue
    6. Dim K5 = CPUK5.NextValue
    7. Dim K6 = CPUK6.NextValue
    8. Dim K7 = CPUK7.NextValue
    9. Dim K8 = CPUK8.NextValue
    10. '__________________________________________________'
    11. Try
    12. If CPT1.Value < K1 Then 'CPT sind die MetroTracker von dem MetroSuit hier aus dem Forum '
    13. CPT1.Value += 1
    14. ElseIf CPT1.Value > K1 Then
    15. CPT1.Value -= 1
    16. End If
    17. Catch ex As Exception
    18. End Try
    19. '__________________________________________________'
    20. Try
    21. If CPT2.Value < K2 Then
    22. CPT2.Value += 1
    23. ElseIf CPT2.Value > K2 Then
    24. CPT2.Value -= 1
    25. End If
    26. Catch ex As Exception
    27. End Try
    28. '__________________________________________________'
    29. Try
    30. If CPT3.Value < K3 Then
    31. CPT3.Value += 1
    32. ElseIf CPT3.Value > K3 Then
    33. CPT3.Value -= 1
    34. End If
    35. Catch ex As Exception
    36. End Try
    37. '__________________________________________________'
    38. Try
    39. If CPT4.Value < K4 Then
    40. CPT4.Value += 1
    41. ElseIf CPT4.Value > K4 Then
    42. CPT4.Value -= 1
    43. End If
    44. Catch ex As Exception
    45. End Try
    46. '__________________________________________________'
    47. Try
    48. If CPT5.Value < K5 Then
    49. CPT5.Value += 1
    50. ElseIf CPT5.Value > K5 Then
    51. CPT5.Value -= 1
    52. End If
    53. Catch ex As Exception
    54. End Try
    55. '__________________________________________________'
    56. Try
    57. If CPT6.Value < K6 Then
    58. CPT6.Value += 1
    59. ElseIf CPT6.Value > K6 Then
    60. CPT6.Value -= 1
    61. End If
    62. Catch ex As Exception
    63. End Try
    64. '__________________________________________________'
    65. Try
    66. If CPT7.Value < K7 Then
    67. CPT7.Value += 1
    68. ElseIf CPT7.Value > K7 Then
    69. CPT7.Value -= 1
    70. End If
    71. Catch ex As Exception
    72. End Try
    73. '__________________________________________________'
    74. Try
    75. If CPT8.Value < K8 Then
    76. CPT8.Value += 1
    77. ElseIf CPT8.Value > K8 Then
    78. CPT8.Value -= 1
    79. End If
    80. Catch ex As Exception
    81. End Try
    82. '__________________________________________________'
    83. End Sub


    Wenn man diesen Sub in einem eigenem Thread nun laufen lassen würde, müsste man doch viel mit Invoke arbeiten oder irre ich mich da. Ich habe das ganze mal mit einem Backgroundworker versucht, aber der führt den Sub nur einmal aus... ist aber auch schon etwas länger her mit den teilen ?( .

    Vielleicht erbarmt sich ja jemand und kann mir helfen :P

    Grüße OneWorld
    Youtube Info Library 2013 jetzt im Showroom.
    Weil das Programm auf zwei Rechnern laufen soll. Der eine hat 4 Kerne 8 Threads der andere hat nur 2 Kerne.

    EDIT: Das geht aber auch ohne bzw. anders denk ich.
    Youtube Info Library 2013 jetzt im Showroom.
    Dann regier entsprechend darauf, wie viele Kerne/Threads ein Rechner hat... Erstelle die PerformanceCounter dynamisch, nicht statisch.

    VB.NET-Quellcode

    1. MessageBox.Show(Environment.ProcessorCount.ToString())
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Such mal nach Parallel.For, falls Du auch parallel arbeiten willst.
    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!
    Das Parallel.For kann das sein das das nur in Netframework 4.5 funktioniert ? EDIT Quatsch :D ich bin blind

    Könnte dann, wenn man das alles mit einem Thread machen würde, mehreres gleichzeitig Invoken ??
    Youtube Info Library 2013 jetzt im Showroom.

    OneWorld schrieb:

    wenn man das alles mit einem Thread machen würde
    Wenn Du Tasks auf mehrere Cores verteilst, laufen mehrere (eben soviele) Threads.
    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!
    Schau Dir das mal an. Erstell Dir eine Klasse, die Dir das Auslesen der entsprechenden PerformanceCounter ermöglicht. Lass die Werte im Sekundentakt von einem System.Timers.Timer abrufen. Der Timers.Timer läuft in einem anderen Thread und das reicht hier vollkommen aus.

    VB.NET-Quellcode

    1. Public Class CpuUtilization
    2. Private _listCounters As New List(Of PerformanceCounter)
    3. Public Event UpdateValuesDone As EventHandler(Of String)
    4. Public Sub New()
    5. For i As Integer = 0 To Environment.ProcessorCount - 1
    6. 'Die Kategorien sind beim mir irgendwie durcheinander, ich muss das so aufrufen, sonst gehts nicht...
    7. Dim pC As New PerformanceCounter("Prozessorinformationen", "Prozessorzeit (%)", "0," & i.ToString())
    8. _listCounters.Add(pC)
    9. Next
    10. End Sub
    11. Public Sub UpdateVales()
    12. Dim sB As New System.Text.StringBuilder()
    13. For Each pC As PerformanceCounter In _listCounters
    14. sB.Append(pC.NextValue.ToString() & "%" & vbNewLine)
    15. Next
    16. OnUpdateValuesDone(sB.Remove(sB.Length - 2, 2).ToString())
    17. End Sub
    18. Protected Overridable Sub OnUpdateValuesDone(s As String)
    19. RaiseEvent UpdateValuesDone(Me, s)
    20. End Sub
    21. End Class


    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents _cpuUtil As New CpuUtilization()
    3. Private WithEvents _t As New System.Timers.Timer With {.Interval = 1000}
    4. Private Sub _cpuUtl_UpdateValuesDone(sender As Object, e As String) Handles _cpuUtil.UpdateValuesDone
    5. Label1.BeginInvoke(Sub()
    6. Label1.Text = e
    7. End Sub)
    8. End Sub
    9. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    10. _t.Start()
    11. End Sub
    12. Private Sub _t_Elapsed(sender As Object, e As Timers.ElapsedEventArgs) Handles _t.Elapsed
    13. _cpuUtil.UpdateVales()
    14. End Sub
    15. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    16. _t.Enabled = Not _t.Enabled
    17. End Sub
    18. End Class
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Das ist Millionenmal besser als das was ich vor hatte :D. Nur verstehe ich nicht ganz diesen Fehler hier:

    Das Typargument "String" erbt nicht vom Einschränkungstyp "System.EventArgs" bzw. implementiert diesen nicht.

    Der Fehler kommt in Zeile 4 bei der CpuUtilization - Klasse.
    Youtube Info Library 2013 jetzt im Showroom.

    SpaceyX schrieb:

    VB.NET-Quellcode

    1. Private Sub _cpuUtl_UpdateValuesDone(sender As Object, e As String) Handles _cpuUtil.UpdateValuesDone
    Dies?
    Der 2. e-Parameter sollte schon von EventArg abgeleitet sein.
    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!
    Ah, ok. In VB2012 kommt dieser Fehler nicht mehr. In VB2010 hingegen schon. Dann machen wir das sauber....

    VB.NET-Quellcode

    1. Public Class CpuUtilization
    2. Private _listCounters As New List(Of PerformanceCounter)
    3. Public Event UpdateValuesDone As EventHandler(Of CpuUpdateValuesCompletedEventArgs)
    4. Public Sub New()
    5. For i As Integer = 0 To Environment.ProcessorCount - 1
    6. 'Die Kategorien sind beim mir irgendwie durcheinander, ich muss das so aufrufen, sonst gehts nicht...
    7. Dim pC As New PerformanceCounter("Prozessorinformationen", "Prozessorzeit (%)", "0," & i.ToString())
    8. _listCounters.Add(pC)
    9. Next
    10. End Sub
    11. Public Sub UpdateVales()
    12. Dim sB As New System.Text.StringBuilder()
    13. For Each pC As PerformanceCounter In _listCounters
    14. sB.Append(pC.NextValue.ToString() & "%" & vbNewLine)
    15. Next
    16. OnUpdateValuesDone(sB.Remove(sB.Length - 2, 2).ToString())
    17. End Sub
    18. Protected Overridable Sub OnUpdateValuesDone(s As String)
    19. RaiseEvent UpdateValuesDone(Me, New CpuUpdateValuesCompletedEventArgs(s))
    20. End Sub
    21. End Class
    22. Public Class CpuUpdateValuesCompletedEventArgs : Inherits EventArgs
    23. Public ReadOnly ResultString As String
    24. Public Sub New(resultString As String)
    25. Me.ResultString = resultString
    26. End Sub
    27. End Class


    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents _cpuUtil As New CpuUtilization()
    3. Private WithEvents _t As New System.Timers.Timer With {.Interval = 1000}
    4. Private Sub _cpuUtl_UpdateValuesDone(sender As Object, e As CpuUpdateValuesCompletedEventArgs) Handles _cpuUtil.UpdateValuesDone
    5. Label1.BeginInvoke(Sub()
    6. Label1.Text = e.ResultString
    7. End Sub)
    8. End Sub
    9. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    10. _t.Start()
    11. End Sub
    12. Private Sub _t_Elapsed(sender As Object, e As Timers.ElapsedEventArgs) Handles _t.Elapsed
    13. _cpuUtil.UpdateVales()
    14. End Sub
    15. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    16. _t.Enabled = Not _t.Enabled
    17. End Sub
    18. End Class


    Bitte nimm meinen Code als ANSATZPUNKT, nicht als Lösung. Es gibt besimmt mehrere, bessere Möglichkeiten da ran zu gehen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Achtung Du hast Public Class Form1 2 Mal im Post :D kanns de ja noch rausmachen ;). Ich werde erstmal versuchen den Code zu verstehen. Danke für eure Hilfe :D
    Youtube Info Library 2013 jetzt im Showroom.
    Hey,

    Ich hab noch eine Frage ich hab den Code von SpaceyX so geändert wie ich ihn brauch, nur möchte ich jetzt die Werte als Value für bzw eine Progressbar ausgeben. Kann man die Werte dann nicht gleich in einem Array speichern anstatt in einem String ?
    Youtube Info Library 2013 jetzt im Showroom.
    Wie meinst du mit UserControl Sry steh grad bisschen dumm in der Gegend...
    Youtube Info Library 2013 jetzt im Showroom.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „OneWorld“ ()

    Soweit ich weiß ist ein UserControl ein Steuerelement welches der Entwickler erstellt, das aber aus einem vorhandenen Steuerelement hervorgeht.
    Youtube Info Library 2013 jetzt im Showroom.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „OneWorld“ ()