Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Warten bis das Form neu gezeichnet wurde?

Moderationshinweis von herbivore (18.12.2006 - 12:47)

Dies ist ein Thread, auf den aus der FAQ verwiesen wird. Bitte keine weitere Diskussion, sondern nur wichtige Ergänzungen und diese bitte knapp und präzise. Vielen Dank!

Muphin
myCSharp.de - Member



Dabei seit:
Beiträge: 174

Themenstarter:

Warten bis das Form neu gezeichnet wurde?

beantworten | zitieren | melden

Mahlzeit!
Ich hab hier ein Form das leider nicht mehr richtig dargestellt wird sobald mal ein anderes Fenster drübergeschoben wird o.ä. da nebenher ziemlich viel gerechnet werden muss, deshalb wollt ich fragen ob es da eine möglichkeit gibt zwischendrin immer zu warten bis die Form neu gezeichnet wurde?

mfg Muphin
private Nachricht | Beiträge des Benutzers
Fabian
myCSharp.de - Member

Avatar #avatar-1590.jpg


Dabei seit:
Beiträge: 1.985
Herkunft: Dortmund

beantworten | zitieren | melden

Hallo Muphin,

zu warten, bis die Form neu gezeichnet wurde, ist der falsche Ansatz. Du solltest die Berechnung in einen extra Thread auslagern, so dass sich das GUI immer neu zeichnen kann.

Such' mal hier im Forum nach Begin bzw. Endinvoke. Das Problem wurde schon häufig angesprochen und gelöst.


Gruß,
Fabian
"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de
private Nachricht | Beiträge des Benutzers
Muphin
myCSharp.de - Member



Dabei seit:
Beiträge: 174

Themenstarter:

beantworten | zitieren | melden

An sowas hat ich auch schon gedacht, aber da das grad eher was kurzes zum ausprobieren werden sollte wollt ich mich da nich gleich in Multithreading einarbeiten!

Aber dankeschön, ich werd mal suchen!
private Nachricht | Beiträge des Benutzers
regen
myCSharp.de - Member



Dabei seit:
Beiträge: 494

beantworten | zitieren | melden

Der BackgroundWorker nimmt dir unter umständen einiges an Arbeit ab
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Muphin,

[Tutorial] Zeichnen in Windows-Programmen (Paint/OnPaint, PictureBox)
Wenn Fenster samt inhalt komplett gezeichent?

herbivore
private Nachricht | Beiträge des Benutzers
Puppetmaster
myCSharp.de - Member

Avatar #avatar-2715.jpeg


Dabei seit:
Beiträge: 225

beantworten | zitieren | melden

In den verlinkten Threads wird es bestimmt auch gesagt.
Aber damit man nicht so viel suchen muss poste ich es hier nochmal.

Mit Application.DoEvents() kann man alle Arbeiten die gerade anstehen ausführen lassen (grob gesagt). Auch die Arbeit, das Fenster neu zeichnen zu lassen.

Damit müsste es also gehen.

Leider scheinen nur wenige diesen Befehl überhaupt zu kennen. Dann werden Mulitthreads eingebaut wo gar keine hinmüssen und auch keine hingehören.
Yunky: was fürn operator muss ich den nehmen wenn ich sagen will nichtgrößergleich??
Yunky: !>3??
Yunky: !≥ ??
Puppetmaster: *G*
Yunky: aja ka
Puppetmaster: kleiner (<)
Yunky: stimmt^^
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10.006

beantworten | zitieren | melden

Es ist eher andersrum das DoEvents nur eine Krücke ist.

Es ist ein Überbleibsel aus der Zeit, als die Programmierung von Threads
zu schwer war.

Heutzutage mit System.Threading.Thread oder dem Backgroundworker ist es
dumm die dann zu erreichende Performance und Einfachheit nicht zu benutzen.

Wie oder wo willst Du z.B. ein DoEvent machen bei einem DataAdapter.Update()
das länger läuft?
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Puppetmaster,

oh, da hatte ich die Frage falsch verstande. Durch deine Antwort ist es mir aber klar geworden, was mit der Frage gemeint war. Allerdings sehe ich es so wie FZelle, das ist kein Fall für DoEvents, sondern für Threads.


Hallo zusammen,

Alles weitere in der FAQ: [FAQ] Warum blockiert mein GUI?

herbivore
private Nachricht | Beiträge des Benutzers
Puppetmaster
myCSharp.de - Member

Avatar #avatar-2715.jpeg


Dabei seit:
Beiträge: 225

beantworten | zitieren | melden

Ist doch schön wenn sich ein Problem einfach lösen lässt. Warum es sich schwer machen wenns auch einfach geht.

Prinzipiell sind Threads natürlich der richtige Weg.
Aber wenn ich mir jetzt eine kleine Klasse (z.B. eine eigene Form mit ner ProgressBar drauf) schreibe, finde ich es ganz sinnvoll nachdem die ProgBar durch eine Methode geändert wurde diese mit einem DoEvent zu "aktualisieren".

Dafür jetzt einen eigenen Thread zu starten fände ich übertrieben.

Natürlich muss man mit diesem Befehl vorsichtig sein und darf ihn nicht als Allheilmittel (wenn man denn eins sucht) für Threads sehen.

Aber ich finde er hat dennoch seine Daseinsberechtigung.
Yunky: was fürn operator muss ich den nehmen wenn ich sagen will nichtgrößergleich??
Yunky: !>3??
Yunky: !≥ ??
Puppetmaster: *G*
Yunky: aja ka
Puppetmaster: kleiner (<)
Yunky: stimmt^^
private Nachricht | Beiträge des Benutzers
regen
myCSharp.de - Member



Dabei seit:
Beiträge: 494

beantworten | zitieren | melden

Naja, hier n bischen gepfusche da n bischen gepfusche und schwups hat man das große chaos
private Nachricht | Beiträge des Benutzers
Borg
myCSharp.de - Member



Dabei seit:
Beiträge: 1.529
Herkunft: Berlin, Germany

beantworten | zitieren | melden

Natürlich funktioniert die Methode. Und vielleicht hat sie auch eine Daseinsberechtigung. Allerdings stellt es halt einfach keine saubere Programmierung dar, wenn die langlaufende Aktion dem Benutzer vorschreibt, wann er irgendeine Aktion mit dem Fenster machen darf.
Man kann immer irgendeine Möglichkeit für DoEvents konstruieren.
Dennoch ist das mit Threads sauberer. Einer für das Fenster und alle dazugehörigen Ereignisse sowie Interaktion mit dem Nutzer und einer nur zum Rechnen.
Und ich finde es ehrlich gesagt einfacher, einmal die Zeile
myBGThread = new Thread( new ThreadStart( myThreadProc ) ); zu schreiben, als immer nachzudenken, wann und wo ein Application.DoEvents() angebracht ist...
private Nachricht | Beiträge des Benutzers
Muphin
myCSharp.de - Member



Dabei seit:
Beiträge: 174

Themenstarter:

beantworten | zitieren | melden

Erst mal ein Dankeschön an euch, da ihr mir wieder gut geholfen habt!
Ich bin auch ehrlich gesagt froh das Puppetmaster mir den Tipp mit Application.DoEvents() gegeben hat, denn so war die Sache mit einer Zeile Code für mich erledigt!
Klar is das so keine saubere Sache, aber für diesen Fall dass ich kurz was gebraucht habe um mir die Sache immer neu zeichnen zu lassen was im späteren Programm wahrscheinlich nicht mehr nötig ist eine echt gute Sache!
Man sollte es eben nur nicht immer einfach so verwenden weils bequemer ist!

MFG Muphin
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Zitat
Original von Puppetmaster
Ist doch schön wenn sich ein Problem einfach lösen lässt. Warum es sich schwer machen wenns auch einfach geht.

Weil es keine Lösung ist. DoEvents() macht Probleme beim Schliessen der Anwendung.

Angenommen du befindest dich in einer Methode des Fensters und drückst den Schliessen-Button. DoEvents() sorgt dafür, dass das Fenster mitten in der Methode abgebaut wird. Dann wird der nach DoEvents() folgende Code weiter ausgeführt. Greifst du jetzt hier auf ein Control des Fensters zu macht es BUMM.

Grundsätzlich sollte man daher DoEvents() nur dann aufrufen, wenn die Message-Pumpe nicht läuft - also eigentlich nie....

Oder man stellt sicher, dass das Fenster nicht schlíeßt.

Keeping your UI Responsive and the Dangers of Application.DoEvents
private Nachricht | Beiträge des Benutzers
Puppetmaster
myCSharp.de - Member

Avatar #avatar-2715.jpeg


Dabei seit:
Beiträge: 225

beantworten | zitieren | melden

wow. Hätte nicht gedacht, dass des so ne Diskussion gibt. Find ich aber immer wieder schön, wenn es Streitthemen gibt.

Bzw. momentan sieht es wohl eher so aus, dass ich gegen den Rest der Welt stehe. Obwohl normalerweise immer ich derjenige bin der "sauberen" Programmierstil predigt ^^.

Also, DoEvents() ist gefährlich. Da sind wir uns wohl alle einig.
Bloß, dass es prinzipiell falsch ist will ich jetzt nicht behaupten.

Ich denke, wenn man das ganze mit Vorsicht genießt müsste es gehen. Außerdem reden wir hier von mickymaus Programmen, denke ich.

Wenn ich in einer Firma sitzen würde, würde ich es auch nicht so machen. Aber man sollte zumindest mal die Alternative mit ihren Gefahren kennen.

Von daher ist dieser Thread gar nicht so schlecht.
Yunky: was fürn operator muss ich den nehmen wenn ich sagen will nichtgrößergleich??
Yunky: !>3??
Yunky: !≥ ??
Puppetmaster: *G*
Yunky: aja ka
Puppetmaster: kleiner (<)
Yunky: stimmt^^
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Puppetmaster,

nee, prinzipiell falsch ist es nicht. Es ist wie immer eine Frage, ob man weiß, was man tut. Nur sage ich mal so: jemand, der DoEvents einsetzt, weil es damit schön einfach ist und das Programm auf den ersten Blick läuft, wird eben meistens nicht wissen, was man tut. Dann lieber gleich Threads empfehlen, denn da ist so ziemlichen jedem klar, dass er aufpassen muss.

herbivore
private Nachricht | Beiträge des Benutzers
Puppetmaster
myCSharp.de - Member

Avatar #avatar-2715.jpeg


Dabei seit:
Beiträge: 225

beantworten | zitieren | melden

ok. Dann sind wir uns ja einig.
Yunky: was fürn operator muss ich den nehmen wenn ich sagen will nichtgrößergleich??
Yunky: !>3??
Yunky: !≥ ??
Puppetmaster: *G*
Yunky: aja ka
Puppetmaster: kleiner (<)
Yunky: stimmt^^
private Nachricht | Beiträge des Benutzers