Benutzer mit den meisten Antworten
.DoEvents

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()
NEXTMit 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. . .* *
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/- Als Antwort markiert Robert Breitenhofer Donnerstag, 24. November 2011 16:04
-
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
- Als Antwort markiert Robert Breitenhofer Donnerstag, 24. November 2011 16:04
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/- Als Antwort markiert Robert Breitenhofer Donnerstag, 24. November 2011 16:04
-
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
- Als Antwort markiert Robert Breitenhofer 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.
-
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