none
.DoEvents RRS feed

  • Frage

  • Hallo,

    ich habe eine kleine Schleife in der etlichen Rechenoperatoren durchgeführt werden.
    Um am Bildschirm bisl was anzuzeigen, habe ich eine Textbox auf dem Fenster mit eingebaut und
    möchte diese während der Schleife mit einem text aktualisieren...quasi den
    Fortschritt anzeigen...

    For iFor 0 UPTO iMax
    .
    .
    .
    Me.WaitTextBox.Text = "blöabla"+iFor.ToString()
    NEXT

    Mit einem Application.DoEvents() zeigt es aber mir erst die Aktualisierung der
    Textbox an...Nur dauert jetzt die Schleife deutlich länger als vorher...
    Ist .DoEvents() der richtige Weg oder trete ich da was anderes noch los oder
    gibts eine andere Sitiuation um die Textbox zu aktualisieren...

    Danke für eine Idee,

    Mario


    Man kann sich mit jeder Programmiersprache ins Knie schießen. Aber bei Objektorientierung kann man die Kugel wiederverwenden. . .* *
    Freitag, 18. November 2011 11:57

Antworten

  • Hallo Mario,

    DoEvents() sollte man, wenn möglich vermeiden. Ich habe extra einen Link auf die englische Seite erstellt, da im Comunity Content am Ende der Seite ein Beispiel ist, das verdeutlicht, was für Probleme daraus erwachsen können.

    Am Besten wäre es, wenn Du Deine Rechenoperationen in einen BackgroundWorker auslagerst und mittels ReportProgress die Anzeige des Fortschritts realisierst.

     


    Hannes

    If you have got questions about this, just ask.

    In a perfect world,
    users would never enter data in the wrong form,
    files they choose to open would always exist
    and code would never have bugs.

    C# to VB.NET: http://www.developerfusion.com/tools/convert/csharp-to-vb/
    Freitag, 18. November 2011 12:07
  • Hallo Mario,

    die Nutzung von DoEvents() ist nicht optimal und es kann zu einigen Komplikationen kommen, die dann teilweise schwer verständlich sind.

    Der normale Ansatz ist, die länger dauernde Aktion in einen eigenen Thread zu verlagern und dann aus dem Thread heraus eine Event auszulösen, welches den Fortschritt / die Ergebnisse mitteilt.

    Eine schöne und leicht zu nutzende Möglichkeit ist der BackgroundWorker, welcher bereits die notwendigen Features bereits eingebaut hat.

    Immer wichtig zu beachten: Wenn Du Controls updaten willst, so hat dies im gleichen Thread zu erfolgen, der die Controls auch erzeugt hat! Bei Windows Forms wäre dies ggf. über Invoke zu erreichen (nach Prüfung von InvokeRequired).

    Mit den besten Grüßen,

    Konrad

    Freitag, 18. November 2011 12:09

Alle Antworten

  • Hallo Mario,

    DoEvents() sollte man, wenn möglich vermeiden. Ich habe extra einen Link auf die englische Seite erstellt, da im Comunity Content am Ende der Seite ein Beispiel ist, das verdeutlicht, was für Probleme daraus erwachsen können.

    Am Besten wäre es, wenn Du Deine Rechenoperationen in einen BackgroundWorker auslagerst und mittels ReportProgress die Anzeige des Fortschritts realisierst.

     


    Hannes

    If you have got questions about this, just ask.

    In a perfect world,
    users would never enter data in the wrong form,
    files they choose to open would always exist
    and code would never have bugs.

    C# to VB.NET: http://www.developerfusion.com/tools/convert/csharp-to-vb/
    Freitag, 18. November 2011 12:07
  • Hallo Mario,

    die Nutzung von DoEvents() ist nicht optimal und es kann zu einigen Komplikationen kommen, die dann teilweise schwer verständlich sind.

    Der normale Ansatz ist, die länger dauernde Aktion in einen eigenen Thread zu verlagern und dann aus dem Thread heraus eine Event auszulösen, welches den Fortschritt / die Ergebnisse mitteilt.

    Eine schöne und leicht zu nutzende Möglichkeit ist der BackgroundWorker, welcher bereits die notwendigen Features bereits eingebaut hat.

    Immer wichtig zu beachten: Wenn Du Controls updaten willst, so hat dies im gleichen Thread zu erfolgen, der die Controls auch erzeugt hat! Bei Windows Forms wäre dies ggf. über Invoke zu erreichen (nach Prüfung von InvokeRequired).

    Mit den besten Grüßen,

    Konrad

    Freitag, 18. November 2011 12:09
  • Hallo Mario Schulz,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Donnerstag, 24. November 2011 16:04
  • Ich finde Threading ist ein schwieriges Thema und man läuft immer wieder in Probleme. Empfehlen würde ich die Reactive Extensions von .net 4.0. Sobald man es mal verstanden hat bekommt man eine gute auslagerung von längeren prozessen hin und man kann den Status sozusagen immer wieder abrufen. Mit Threading allein finde ich das nicht so einfach.
    Freitag, 25. November 2011 08:58
  • Hallo rodin3D,

    Ich gebe dir insofern Recht, dass Threading nicht ganz einfach ist. Die komplexität steigt mit der Anzahl der Threads rapide an, aber bei einem einzelnen Backgroundworker hält sich die komplexität noch in Grenzen, und es ist noch recht einfach zu handeln ;-)

    Viele Grüße
    Holger M. Rößler


    Kaum macht man es richtig, schon funktioniert es
    Montag, 5. Dezember 2011 19:32