[VB] Programm wird zu schnell ausgeführt?

11/11/2012 20:14 Ludder231#1
Hi,

da ich noch Anfäger bin in VB hab ich mir einen Dateisortierer gebastelt.

Nun, wird das Label " lbl_verbleibende_dateien" immer sofort auf 0 gesetzt und das Label "lbl_datei" ist immer "?". Wenn ich ne msgbox() vor "next" mache, dann wird alles perfekt angezeigt.

MfG Ludder231
11/11/2012 20:42 tolio#2
mach halt an ne stelle irgendwo nen 100ms wait oder so dann siehste obs durchläuft
11/11/2012 20:53 Ludder231#3
Quote:
Originally Posted by tolio View Post
mach halt an ne stelle irgendwo nen 100ms wait oder so dann siehste obs durchläuft
Und wie mach ich ne Wait ?
Ich habs jz mit thread.sleep() gemacht, aber die labels bleiben immernoch leer.
11/11/2012 21:03 3Angle#4
Application.DoEvents muss da rein, damit der das GUI updaten kann...
11/11/2012 21:06 Ludder231#5
Ah danke, wusste ich nicht dass die nicht updaten können.
11/11/2012 22:24 Mi4uric3#6
Quote:
Originally Posted by Ludder231 View Post
Ah danke, wusste ich nicht dass die nicht updaten können.
Ist halt im selben Thread wie das Malen des GUIs. Und wenn der Thread dann grade mit deinem Code zugange ist kann er nicht gleichzeitig das GUI updaten :)
Dafür das "DoEvents()", das ruft zwanghaft die Interaktion mit dem GUI auf.
11/11/2012 23:37 tolio#7
google -> "vb.net wait" -> erstes ergebniss ist eine methode die solange die zu wartende zeit nicht abgelaufen ist nur das gui aktualisiert => geeignet für das was du machen willst
11/11/2012 23:44 Kraizy​#8
DoEvents() ist böse :<
Würde es dir nicht raten zu benutzen
11/12/2012 01:14 tolio#9
hier in dem fall um nur eine anzeige aktualisierung zu veranschaulichen ist doevents genau das richtige
11/12/2012 12:11 Kraizy​#10
DoEvents sollte am besten immer vermieden werden. Klar, es ist die einfachste und schnellste Möglichkeit für faule Programmierer, um Controls während einer Schleife oder sonst was zu aktualisieren, aber sicherlich keine schöne, zudem sogar noch ziemlich gefährlich für den Programmablauf. Selbst MS sagt, dass man diese Methode mit Bedacht nutzen sollte, wenn überhaupt:

Quote:
Vorsicht
Das Aufrufen dieser Methode bewirkt, dass der aktuelle Thread angehalten wird, während alle wartenden Fenstermeldungen verarbeitet werden.Wenn eine Meldung bewirkt, dass ein Ereignis ausgelöst wird, dann werden andere Bereiche des Anwendungscodes möglicherweise ausgeführt.Dies kann bewirken, dass die Anwendung unerwartete Verhaltensweisen zeigt, die schwierig zu debuggen sind.Wenn Sie Vorgänge oder Berechnungen ausführen, die eine lange Zeit brauchen, ist es oft vorzuziehen, jene Vorgänge auf einem neuen Thread auszuführen.Weitere Informationen über asynchrone Programmierung finden Sie unter [Only registered and activated users can see links. Click Here To Register...].

[Only registered and activated users can see links. Click Here To Register...]
Wie gesagt, am besten sollte man DoEvents immer vermeiden, und eine (bessere) Alternative suchen, denn die gibt es eigentlich immer. Um z.B. ein Label zu aktualisieren, reicht auch einfach ein extra dafür gemachtes Event aufzurufen: .Update() (oder ein anderes banales Beispiel: beim WebBrowser, statt DoEvents in einer While-Schleife aufzurufen (ja, das habe ich, besonders in diesem Forum, schon oft bei z.B. billigen YouTube Bots gesehen) und zu warten, bis die Seite geladen wurde, nutzt man einfach das extra dafür vorgesehene Event: .DocumentCompleted(). Und so gibt es eigentlich für alles eine "Alternative").

Am besten ist es jedoch sowieso, wenn man Arbeitsvorgänge, besonders diese, welche längere Zeit brauchen, komplett von der GUI trennt, indem man z.B. einen separaten Thread nutzt. Das Aktualisieren der Controls läuft dann über Invoke/Delegate.

Hier ist noch ein schöner Beitrag zu DoEvents, zwar auf Englisch, aber naja, sollte man als Programmierer sowieso können: [Only registered and activated users can see links. Click Here To Register...]
Gibt auch noch viel mehr Seiten, die die Nachteile von DoEvents aufzeigen, einfach mal danach googlen.