|
You last visited: Today at 23:46
Advertisement
[VB] Programm wird zu schnell ausgeführt?
Discussion on [VB] Programm wird zu schnell ausgeführt? within the .NET Languages forum part of the Coders Den category.
11/11/2012, 20:14
|
#1
|
elite*gold: 0
Join Date: Aug 2010
Posts: 880
Received Thanks: 113
|
[VB] Programm wird zu schnell ausgeführt?
Hi,
da ich noch Anfäger bin in VB hab ich mir einen Dateisortierer gebastelt.
PHP Code:
Private Sub btn_move_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_sortieren.Click Dim dateipfad As Array Dim dateiname As Array Dim anzahl_dateien As Integer Dim count As Integer
If (fd_files.ShowDialog() = DialogResult.OK) Then ' wenn Openfile ein OK zurück gibt
If (fd_speicher_pfad.ShowDialog() = DialogResult.OK) Then ' wenn Openfile ein OK zurück gibt
dateipfad = fd_files.FileNames dateiname = fd_files.SafeFileNames anzahl_dateien = UBound(dateiname) + 1 lbl_anzahl_dateien.Text = anzahl_dateien lbl_verbleibende_dateien.Text = anzahl_dateien prgb_fortschritt.Maximum = anzahl_dateien
For I = 0 To anzahl_dateien - 1
count = (anzahl_dateien - 1) - I lbl_datei.Text = dateiname(I)
If dateiname(I).contains(".mp4") Then If chb_mp4.CheckState = CheckState.Checked Then If Not My.Computer.FileSystem.DirectoryExists(fd_speicher_pfad.SelectedPath & "\mp4") Then
My.Computer.FileSystem.CreateDirectory(fd_speicher_pfad.SelectedPath & "\mp4")
End If
My.Computer.FileSystem.CopyFile(dateipfad(I), fd_speicher_pfad.SelectedPath & "\mp4\" & dateiname(I)) ' Kopieren End If ElseIf dateiname(I).contains(".txt") Then If chb_txt.CheckState = CheckState.Checked Then If Not My.Computer.FileSystem.DirectoryExists(fd_speicher_pfad.SelectedPath & "\txt") Then
My.Computer.FileSystem.CreateDirectory(fd_speicher_pfad.SelectedPath & "\txt")
End If
My.Computer.FileSystem.CopyFile(dateipfad(I), fd_speicher_pfad.SelectedPath & "\txt\" & dateiname(I)) ' Kopieren
End If ElseIf dateiname(I).contains(".mp3") Then If chb_mp3.CheckState = CheckState.Checked Then If Not My.Computer.FileSystem.DirectoryExists(fd_speicher_pfad.SelectedPath & "\mp3") Then
My.Computer.FileSystem.CreateDirectory(fd_speicher_pfad.SelectedPath & "\mp3")
End If
My.Computer.FileSystem.CopyFile(dateipfad(I), fd_speicher_pfad.SelectedPath & "\mp3\" & dateiname(I)) ' Kopieren End If
ElseIf dateiname(I).contains(".jpg") Or dateiname(I).contains(".png") Or dateiname(I).contains(".bmp") Then If chb_pic.CheckState = CheckState.Checked Then If Not My.Computer.FileSystem.DirectoryExists(fd_speicher_pfad.SelectedPath & "\pictures") Then
My.Computer.FileSystem.CreateDirectory(fd_speicher_pfad.SelectedPath & "\pictures")
End If
My.Computer.FileSystem.CopyFile(dateipfad(I), fd_speicher_pfad.SelectedPath & "\pictures\" & dateiname(I)) ' Kopieren End If End If
prgb_fortschritt.Value = I + 1 lbl_verbleibende_dateien.Text = count
Next End If End If End Sub
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
|
#2
|
elite*gold: 2932
Join Date: Oct 2009
Posts: 6,966
Received Thanks: 1,097
|
mach halt an ne stelle irgendwo nen 100ms wait oder so dann siehste obs durchläuft
|
|
|
11/11/2012, 20:53
|
#3
|
elite*gold: 0
Join Date: Aug 2010
Posts: 880
Received Thanks: 113
|
Quote:
Originally Posted by tolio
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
|
#4
|
elite*gold: 0
Join Date: Jul 2012
Posts: 284
Received Thanks: 127
|
Application.DoEvents muss da rein, damit der das GUI updaten kann...
|
|
|
11/11/2012, 21:06
|
#5
|
elite*gold: 0
Join Date: Aug 2010
Posts: 880
Received Thanks: 113
|
Ah danke, wusste ich nicht dass die nicht updaten können.
|
|
|
11/11/2012, 22:24
|
#6
|
elite*gold: 405
Join Date: Dec 2007
Posts: 6,615
Received Thanks: 6,358
|
Quote:
Originally Posted by Ludder231
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
|
#7
|
elite*gold: 2932
Join Date: Oct 2009
Posts: 6,966
Received Thanks: 1,097
|
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
|
#8
|
elite*gold: 0
Join Date: Apr 2010
Posts: 9,696
Received Thanks: 1,811
|
DoEvents() ist böse :<
Würde es dir nicht raten zu benutzen
|
|
|
11/12/2012, 01:14
|
#9
|
elite*gold: 2932
Join Date: Oct 2009
Posts: 6,966
Received Thanks: 1,097
|
hier in dem fall um nur eine anzeige aktualisierung zu veranschaulichen ist doevents genau das richtige
|
|
|
11/12/2012, 12:11
|
#10
|
elite*gold: 0
Join Date: Apr 2010
Posts: 9,696
Received Thanks: 1,811
|
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 .
|
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: 
Gibt auch noch viel mehr Seiten, die die Nachteile von DoEvents aufzeigen, einfach mal danach googlen.
|
|
|
 |
Similar Threads
|
DllMain wird nicht ausgeführt
04/30/2012 - C/C++ - 30 Replies
Hi,
hab hier folgendes Problem, will MessageBoxW hooken, allerdings wird scheinbar DllMain nicht mal ausgeführt.. da denke ich jetzt versteh ich das Hooken einmal, dann scheitere ich schon am erstellen einer DLL xD
Nach dem Injecten passiert einfach nichts o.0
Habs bei einem selbst erstellten Programm getestet, das in einem Endlosloop MessageBoxW aufruft.
Verwende VS2010.
Hab Win32 Project -> DLL ausgewählt (mit precompiled header).
Hab jetzt echt keine Ahnung an was es scheitert.
Bitte...
|
Screencapture wird schon beim start ausgeführt.
11/13/2011 - AutoIt - 3 Replies
Wie der Titel schon sagt macht mein momentanes Script schon ein Screenshot wenn ich es öffne, das soll aber so nicht sein.
1. Screenshot bei klicken auf Button
2. Screenshot bei drücken von F12 ( auch hidden ? )
3. Oben nur ein Minimieren Knopf, im moment ist dort garnichts
Script
#include <WindowsConstants.au3>
#include <ScreenCapture.au3>
GUICreate ( "Premaiders Desktop Tool",310,270,-1,-1,$WS_CAPTION)
|
Der Audiodienst wird nicht ausgeführt
04/10/2011 - Technical Support - 19 Replies
Bei PC Tools Internet Security kam gerade eine Meldung, dass ein glaub verdächtiger Prozess läuft.
Ich hab dann auf Quarantäne geklickt. Und plötzlich war mein Ton weg Oo ; und auch das rote Kreu über dem Lautsprecher (s.Bild).
Habe Doppelklick draufgeklickt auf den Lautsprecher und dann kam das. (s.Bild)
Ich dachte mir dann so, wenn ich es wieder aus der Quarantäne entferne geht es wieder und das rote Kreuz geht weg, aber nachdem ich es bei PC Tools Internet Security aus der Q....
|
wie kann ich eine exe in ein jpg verstecken und das durch kliken ausgeführt wird
05/06/2010 - General Coding - 7 Replies
wie kann ich eine exe in ein jpg verstecken und das durch kliken ausgeführt wird
|
wie kann ich eine exe in ein jpg verstecken und das durch kliken ausgeführt wird
04/26/2010 - Main - 7 Replies
wie kann ich eine exe in ein jpg verstecken und das durch kliken ausgeführt wird.
|
All times are GMT +1. The time now is 23:47.
|
|