Eine Frage zur Application.DoEvents() und der CPU-Last!

  • VB.NET
  • .NET (FX) 1.0–2.0

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Cheffboss.

    Eine Frage zur Application.DoEvents() und der CPU-Last!

    Moin! :)
    Ich habe ein Programm geschrieben, dass mir über TCP/IP einen String sendet.
    Bis jetzt geht alles gut, auf meiner schnellen CPU.
    Das Programm benötigt ca. 0-4 % CPU-Last.
    Als ich das aber auf einen älteren Computer, mit einer sehr langsamen CPU ausgeführt habe.
    Sind es ca. 12-22%.
    Ich habe schon alles möglichste probiert, um die CPU-Last zu reduzieren.
    Meine Frage, wenn ich in meinem Code Application.DoEvents() verwende, in einer Schleife.
    Hilft das der CPU-Last zu mindern?
    Oder ist dass, das gegenteil?
    Freue mich auf eure Antwort.
    BIG THX

    VB.NET-Quellcode

    1. Private Sub SofortSenden()
    2. Dim inhalt As String = ""
    3. For Each test As String In Me.listboxItems1
    4. inhalt &= test & "*"
    5. Application.DoEvents() ' mit oder ohne?
    6. Next
    7. inhalt &= "|||||!ENDE!|||||"
    8. Winsock1.SendenClient(inhalt)
    9. End Sub
    Visual Basic.NET 8o
    MS-SQL
    8o
    Application.DoEvents() sorgt nur dafür, dass die Kommunikation zwischen Windows als OS und dem Programm aufrecht erhalten wird. Wenn Application.DoEvents() in deiner Schleife steht und das programm rödelt, kannst du währenddessen die Form verschieben, minimieren, etc, diese ganze Interaktion eben. Das Problem an Application.DoEvents() ist, dass der Benutzer dann etwas auslösen könnte, was er sonst nicht könnte, weil ein Buttonklick noch nicht funktioniert. Was würde passieren, wenn diese Schleife nun zweimal aktiviert wird? Ist doof.
    CPU-Last vermindert es nicht.

    Was ich mal gelesen habe, und korrigiert mich gerne, ist, dass es durch Application.DoEvents() zum Code-Ausstieg und Wiedereinstieg kommt. Und das will man nicht. Hab ich so gehört.

    Wie lange dauert denn ein Durchlauf?
    Und wie oft wird das den aufgerufen?
    Den String würde ich mit nem StringBuilder zusammen stückeln.
    Und zum DoEvents.
    Läuft mein Eselchen ist zu langsam für den Karren, läuft der schneller wenn ich noch ein paar Steine drauf packe? ;) :D

    Cheffboss schrieb:

    Ich habe schon alles möglichste probiert, um die CPU-Last zu reduzieren.


    Mach mal ein KonsolenProjekt um folgendes zu testen, behalte wenn das programm startet die CPU Auslatung im Taskmanager im Auge.

    C#-Quellcode

    1. static void Main(string[] args)
    2. {
    3. DateTime startTime = DateTime.Now;
    4. while((DateTime.Now - startTime).Seconds < 15)
    5. {
    6. }
    7. while ((DateTime.Now - startTime).Seconds < 30)
    8. {
    9. Thread.Sleep(1);
    10. }
    11. }


    Indem man den Thread kurz schlafen legt, kann man die CPU Last reduzieren, dann dauert aber alles länger, kann jenachdem was geschieht kaum spürbar sein.

    Da meine Glaskugel gerade mit Antimaterie aufpoliert wird für eine superglatte Oberfläche, rate ich mal, das nicht unbedingt de kleine Loop ressourcen schluckend ist, sondern das in Winsock1 irgendwo, die Last aufkommt.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Takafusa“ ()

    @Bartosz
    Danke für deine gute Erklärung meiner Frage. :thumbup:

    @Naifu
    Ebenfalls, Danke. :)
    Der Durchlauf dauert ein paar Millisekunden.
    Alle 4 Sekunden wird die Sub aufgerufen.
    Ich habe meinen String ersetzt durch einen StringBuilder.

    @Takafusa
    Danke, für den Tipp, den Thread kurz schlafen zu lassen. ^^
    Ich habe das nun so programmiert.
    Und werde es dann demnächst auf dem langsamen Computer testen.
    Und hoffe, dass ich durch eure Tipps dann die CPU-Last deutlich verringern kann.
    Visual Basic.NET 8o
    MS-SQL
    8o