VB frage zu doEvents

donar

Cadet 3rd Year
Registriert
Juli 2002
Beiträge
59
Weiss jemand wie ich den aufruf "application.doevents()" riguros wieder stoppen kann wenn ein bestimmtes ereignis ausgeloest wurde? Geht das ueberhaupt? Gibts ne alternative zu doevents?

thread.sleep waere doch eine Alternative oder? Wird hier eigentlich das ganze programm eingefroren (inklusive timer)?

Regards

Donar
 
Application.DoEvents() übergibt meines Wissens nur kurz die Kontrolle an die Ereigniswarteschlange, so dass das nächste, anstehende Ereignis verarbeitet werden kann. Danach erhält die aufrufende Methode wieder die Steuerung.

Thread.Sleep() solltest Du auf gar keinen Fall verwenden. Damit wird der aktuelle Thread für die angegebene Dauer blockiert, so dass auch keine Ereignisse verarbeitet werden können. Im GUI-Thread hat dies zur Folge, dass die Oberfläche "einfriert".

Eine Alternative ist "echtes" Multithreading. DoEvents() ist ja eher die "Billigvariante" von paralleler Verarbeitung und vorwiegend nur für einfache Anwendungsfälle geeignet. Echte Nebenläufigkeit erreichst Du, indem Du zusätzliche Hintergrund-Threads erzeugst, die bestimmte Aufgaben übernehmen und parallel zum GUI-Thread abarbeiten. Allerdings ist die Synchronisation und Interaktion mit dem GUI recht kompliziert. Eine dankbare Lösung bietet der so genannte BackgroundWorker im .NET Framework. Diese Klasse bietet drei Ereignisse, von denen das DoWork-Ereignis in einem separaten Thread ausgeführt wird. Eine prima Möglichkeit, um etwa Verarbeitungen mit regelmäßiger Rückmeldung (z.B. Statusbalken) nebenläufig zu absolvieren.
 
erstmal danke fuer die ausfuehrliche Antwort. Thread kommt fuer mich im Moment mal noch nicht in Frage. Sollte nur ne einfache Warteschleife sein. Den BackgroundWorker werd ich mir mal ansehen. Hier mal das Problem:

Ich starte einen Timer, bis das erste intervall vorbei ist soll eine Warteschleife starten.

While exitFlag = False
Application.DoEvents()
End While

das exitFlag wird auf True gesetzt sobald das Tick event von dem timer ausgeloest wird.

Nun noch ein paar worte zum Programm selber. Ich hatte eine vorgegebenes Main programm. In dieses habe ich einen Button eingefuegt mit dem meine application gestartet wird. Ueber dessen Oberflaeche kann man nun die Zeit fuer den timer eingeben. Im Debug modus habe ich gesehen das alles bis doevents laeuft. Aber da bleibt er haengen. er geht erst aus diesem Befehl raus wenn ich meine application und das Mainprogramm schliesse . Dann springt er zu "end While " Ich kann mir beim besten willen nicht vorstellen warum.
 
Zurück
Oben