CPU Auslastung beim Timer zu hoch - verringern?

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von sothere.

    CPU Auslastung beim Timer zu hoch - verringern?

    Moin zusammen,

    ich habe ein Tool mit einem Liveticker wie folgt:

    VB.NET-Quellcode

    1. Public Class mainpanel
    2. Dim sAnimatedText As String = "Herzlich Willkommen"
    3. Dim nPos As Integer = 0
    4. Dim WithEvents oTimer As Timer
    5. Private Sub mainpanel_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    6. 'Me.Size = New Point(772, 22)
    7. With Screen.PrimaryScreen.WorkingArea
    8. Me.Location = New Point(.Left + (.Right - .Left - Me.Width) / 2, 0)
    9. End With
    10. oTimer = New Timer
    11. oTimer.Interval = 100
    12. oTimer.Start()
    13. End Sub
    14. Private Sub oTimer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles oTimer.Tick
    15. nPos += Int(Tickerspeed.Text)
    16. PictureBox1.Invalidate()
    17. End Sub
    18. Private Sub PictureBox1_Paint(ByVal sender As Object, _
    19. ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    20. ' String zusammensetzen
    21. Dim sText As String = ""
    22. With sAnimatedText
    23. Dim x As Integer
    24. If .Length > 0 Then
    25. If .Length < 180 Then
    26. x = 180 - .Length
    27. Dim MyString As String = sAnimatedText
    28. sAnimatedText = MyString.PadRight(x, " ")
    29. End If
    30. If nPos < 1 OrElse nPos > .Length Then nPos = 1
    31. sText = .Substring(nPos - 1) & IIf(nPos > 1, .Substring(0, nPos - 1), "")
    32. End If
    33. End With
    34. ' String-Format (kein Zeilenumbruch)
    35. Dim DrawFormat As New StringFormat
    36. DrawFormat.FormatFlags = StringFormatFlags.NoWrap
    37. ' Rechteck für die Textausgabe
    38. Dim oRect As New Rectangle(5, 3, e.ClipRectangle.Right - 5, _
    39. e.ClipRectangle.Bottom - 5)
    40. ' Jetzt den Text in das Graphics-Objekt zeichnen
    41. e.Graphics.DrawString(sText, New Font("Arial", 12, FontStyle.Bold), _
    42. Brushes.SteelBlue, oRect, DrawFormat)
    43. End Sub
    44. end class


    Die CPU Auslastung liegt bei dem Tool bei 25%. Das ist im laufenden Betrieb und Nutzung weiterer Programme ganz schön Fett. Gibts denn eine Möglichkeit die Auslastung auf 5% zu fahren?

    Ohne den Timer liegt sie bei 0-3% je nach Aktion.

    Vielen Dank im voraus.
    Ich würde gern die Welt verändern, aber Gott gibt mir den Quelltext nicht.
    @MSB2000 Soll das eine Laufschrift werden?
    Mach das vllt. in einer einzeiligen Textbox oder einem Label.
    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!

    MSB2000 schrieb:

    genauso viel Resourcen
    Probier es einfach aus. :D
    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 Rad muss in die andere Richtung:-) Statt wie vorher 25% CPU Auslastung habe ich jetzt 50% CPU Auslastung:-) das ist zu fett.

    Code habe ich konform disen hier genommen zum testen:

    VB.NET-Quellcode

    1. Public Class Form1
    2. ' Text, der als Laufschrift angezeigt werden soll
    3. Dim sAnimatedText As String = "Herzlich Willkommen bei " & _
    4. "www.vbarchiv.net - die deutschsprachige Internetseite, " & _
    5. "wenn es ums Programmieren mit Visual Basic geht +++ "
    6. Dim txFont As Font = New Font("Arial", 14.0F, FontStyle.Regular)
    7. Dim txColor As Color = Color.Blue
    8. ' Timer-Objekt zum Steuern der Laufschrift
    9. Dim WithEvents oTimer As Timer
    10. Private Sub Form1_Load(ByVal sender As System.Object, _
    11. ByVal e As System.EventArgs) Handles MyBase.Load
    12. With Label1
    13. .Parent = Panel1
    14. .Text = sAnimatedText
    15. .Font = txFont
    16. .ForeColor = txColor
    17. .Left = .Parent.Right
    18. .Top = (.Parent.Height - .Height) / 2
    19. End With
    20. Dim faktor As Short = Panel1.Width / Label1.Width - 1
    21. For i As Short = 0 To faktor - 1
    22. Label1.Text += sAnimatedText
    23. Next
    24. With Label2
    25. .Parent = Panel1
    26. .Font = txFont
    27. .ForeColor = txColor
    28. .Top = Label1.Top
    29. .Left = Label1.Right
    30. .Text = Label1.Text
    31. End With
    32. ' Timer starten
    33. oTimer = New Timer
    34. oTimer.Interval = 30
    35. oTimer.Start()
    36. End Sub
    37. Private Sub oTimer_Tick(ByVal sender As Object, _
    38. ByVal e As System.EventArgs) Handles oTimer.Tick
    39. ' bewegen der Labels
    40. Label1.Left -= 1
    41. Label2.Left -= 1
    42. If Label2.Right < 0 Then Label2.Left = Label1.Right
    43. If Label1.Right < 0 Then Label1.Left = Label2.Right
    44. End Sub
    45. Private Sub Form1_FormClosing(ByVal sender As Object, _
    46. ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    47. ' Timer stoppen
    48. oTimer.Stop()
    49. oTimer.Dispose()
    50. End Sub
    51. End Class
    Ich würde gern die Welt verändern, aber Gott gibt mir den Quelltext nicht.
    Ne obwohl die Teile richtig cool sind:-) wollte damit mal ne Homematic Haussteuerung anpeilen und als server laufen haben - naja anderes Thema 8o

    wenn ich den Timer Intervall vergrößere sinkt die Auslastung - aber halt Meeega langsame Laufschrift :D

    Wenn die Timer off sind ist alles schick...muss also an den Timer liegen.

    läuft auf: Intel Core Due E4400 2,00GHz mit 2GB Ram und WIN7 32Bit System
    Ich würde gern die Welt verändern, aber Gott gibt mir den Quelltext nicht.
    Aber mal so nebenbei, warum benutzt du an dieser Stelle:

    VB.NET-Quellcode

    1. Dim faktor As Short = Panel1.Width / Label1.Width - 1
    2. For i As Short = 0 To faktor - 1
    3. Label1.Text += sAnimatedText
    4. Next
    Einen short, statt eines Ints? C# lässt mich hier nicht einfach so dividieren, ich müsste schon mindestens eine Konvertierung ausführen.
    Option Strict on? Vllt. aber auch nur eine eigenart von C#.

    MSB2000 schrieb:

    VB.NET-Quellcode

    1. Label1.Left -= 1
    Du musst nicht das Label bewegen, sondern den Text im Label "rollen" lassen.

    VB.NET-Quellcode

    1. Dim txt = Label1.Text
    2. Label1.Text = txt.Substring(1) & txt(0)
    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!
    MAcht leider keinen Unterschied aus ob das Label bewegt wird oder der Text gerollt wird...zumindest nicht zum Ursprungsproblem von 25%..

    lasse ich das Label bewegen sind es 50% (irgendwie verständlich)
    lasse ich den Text rollen sind es zwar weniger aber immer noch 25% wie im ersten Code....

    Komisch - das kann doch nie soviel Resourcen fressen....
    Ich würde gern die Welt verändern, aber Gott gibt mir den Quelltext nicht.

    MSB2000 schrieb:

    VB.NET-Quellcode

    1. oTimer.Interval = 30
    Ist dieser Wert nötig?
    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!
    So recht scheint es hierfür auch keine Lösung zu geben. Onkel Google spuckt diesbezüglich zwar verschiedene Methoden aus aber die Auslastung bleibt.
    klar ist auch das der Prozessor ne Rolle spielt. Auf meinem Firmenlappi (I5 2,5GHz 8GB RAM) hab ich gerade mal zwischen 3-5%.

    Aber auf den Kisten in der Firma das fünffache:-)

    Ich werde es anders machen - eben keine Laufschrift, sondern blinken. Das steht die Leistung bei 0 - 4%.
    Ich würde gern die Welt verändern, aber Gott gibt mir den Quelltext nicht.
    Also wenn du wirklich Text scrollst, dürftest du niemals eine so hohe Auslastung haben. Hast du sowas mal probiert: dotnettutorials.com/tutorials/…et/text-scroll-effect-cs/. Zumindest vom Prinzip her. Hier wirste nämlich das Problem haben, dass beim Scrollen die Form hängt (da du den GUI Thread einfrierst - kannste aber genau so gut mit nem Timer machen).
    Edit: Sowas meinte ich:

    C#-Quellcode

    1. public partial class Form1 : Form
    2. {
    3. private string _textToScroll = "Dein Text den du scrollen willst.";
    4. private int _scrollOffset;
    5. ...
    6. private void timer1_Tick( object sender, EventArgs e )
    7. {
    8. string textToDisplay = _textToScroll.Substring( _scrollOffset++ );
    9. this.toolStripLabel1.Text = textToDisplay;
    10. if ( _scrollOffset > _labelText.Length )
    11. {
    12. _scrollOffset = 0;
    13. }
    14. }
    15. }

    Sowas kostet eigentlich so gut wie keine Performance (es sei denn du verwendest kp was für nen absurdes Interval). Hier musst du das Interval so oder so etwas langsamer wählen, da der Text um einen Buchstaben verschoben wird. Wenn du da ein Interval von 30 ms verwendet, dann kannste so oder so nix mehr lesen.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „thefiloe“ ()