[VB] Trotz Auslastung Form aktualisieren

badsaxa

Active member
ID: 37836
L
19 Juli 2006
25
0
hi,

hab da mal eine wahrscheinlich einfache frage.
mein programm durchsucht sämtliche ordner und unterordner nach mp3s und trägt die ergebnisse in eine datenbank ein. dies kann je nach anzahl einige minuten dauern. damit es nicht so aussieht, als wenn das programm abgestürzt ist, wollte ich eine progressbar anzeigen, die von einem timer angsteuert alle 2 sekunden (oder so), aktualisiert wird.
mein problem ist das das ganze nicht funktioniert. ich starte zwar meinen timer, aber dieser versucht erst die progressbar zu füllen, wenn alles andere bereuts erledigt. ist.
kann ich dem timer eine höhere priorität oder so geben? oder gibt es eine noch einfachere möglichkeit?

mfg
badsaxa
 
Wenn VB arbeitet, wird nichts weiter mehr ausgeführt (=Anwendung reagiert nicht mehr). Um das zu vermeiden, musst du in die "Arbeitsschleife" eine DoEvents-Anweisung einbauen.

Ich warne aber: Ruf sie nur alle x Durchgänge auf und nicht andauernd, sonst bremst sie enorm ab.
 
unterstützt VisualBasic keine Threads bzw. nebenläufige Programme, wie sie auch genannt werden?
Nein. Wenn du Multithreading machen willst, musst du einen Thread auch via WinAPI absplitten/erzeugen :ugly: Und dann kannstde auch gleich alles in C++ schreiben und VB in die Tonne kloppen.

VB is eben nur VB :p
 
Ich hätte den Code für die MP3 Sucherei in einen anderen Timer geschrieben, der ein Intervall von 1 hat. Dann ist die Form nicht mehr ausgelastet und der andere Timer kann die Progressbar füllen. So habe ich das immer gemacht.
 
Ich hätte den Code für die MP3 Sucherei in einen anderen Timer geschrieben, der ein Intervall von 1 hat. Dann ist die Form nicht mehr ausgelastet und der andere Timer kann die Progressbar füllen. So habe ich das immer gemacht.
Geht nicht, glaub mir. Ich habs btw nochmal ausprobiert:
Code:
[FONT=Courier New][COLOR=Blue]Private Sub[/COLOR][/FONT][FONT=Courier New] Command1_Click()
  Timer1.Enabled = [/FONT][FONT=Courier New][COLOR=Blue]True[/COLOR][/FONT][FONT=Courier New]
  Timer1.Interval = 1
  [/FONT][FONT=Courier New][COLOR=Blue]For[/COLOR][/FONT][FONT=Courier New] i = 1 [/FONT][FONT=Courier New][COLOR=Blue]To[/COLOR][/FONT][FONT=Courier New] 10000
    [/FONT][FONT=Courier New][COLOR=Blue]Debug[/COLOR][/FONT][FONT=Courier New].[/FONT][FONT=Courier New][COLOR=Blue]Print[/COLOR][/FONT][FONT=Courier New] i
  [/FONT][FONT=Courier New][COLOR=Blue]Next[/COLOR][/FONT][FONT=Courier New] i
  Timer1.Enabled = [/FONT][FONT=Courier New][COLOR=Blue]False[/COLOR][/FONT][FONT=Courier New]
[/FONT] [FONT=Courier New][COLOR=Blue]End Sub[/COLOR][/FONT][FONT=Courier New]

[/FONT] [FONT=Courier New][COLOR=Blue]Private Sub[/COLOR][/FONT][FONT=Courier New] Timer1_Timer()
  [/FONT][FONT=Courier New][COLOR=Blue]Debug[/COLOR][/FONT][FONT=Courier New].[/FONT][FONT=Courier New][COLOR=Blue]Print[/COLOR][/FONT][FONT=Courier New] "FUCK"
[/FONT] [FONT=Courier New][COLOR=Blue]End Sub[/COLOR][/FONT]
"FUCK" wird kein einziges Mal ausgegeben ;)

edit:
Erst wenn DoEvents in der Schleife is, funktioniert es.
 
Es gibt eine Erweiterung, mit der ich in VB doch sehr erfolgreich sowas wie Threads einsetzen konnte.
Schau dich mal auf https://www.vbaccelerator.com/ nach "Subclassing" und "SSubtimer" um. Damit lässt sich sowas wie Multithreading einigermassen gut auch in VB realisieren. Du wirst aber nicht umher kommen, den einen anderen Trick dabei anzuwenden.

Ich hatte auch mal eine andere Erweiterung benutzt, die auch Singletons und ähnliches ermöglichte. Das war eine echte Multithreading-Erweiterung. Den Namen weiß ich leider gerade nicht, vielleicht findest du es, wenn du nach "Threads" und "Singleton" bei Google suchst. Veröffentlicht wurde sie von einer VB-Zeitschrift, vielleicht hiflt das deiner Suche.

Allerdings, VB selbst ist nicht threadsicher, erst recht nicht die IDE. Wenn du also z.B. u.a. Subclassing-Module debuggen willst, wird das nicht wirklich hinhauen, die IDE wird evtl. sogar abstürzen. Das gleiche gilt, falls du mit den WinAPI-Funktionen Threads realisieren willst (was aber etwas aufwändiger werden kann, da du evtl. einen Threadmanager und so basteln müsstest).

In solchen Situationen empfiehle ich immer den Umstieg auf Delphi. Es ist kaum schwieriger und hat die ganzen VB-Einschränkungen nicht. Threads sind hier ein Kinderspiel! Zudem unterstützt es das ganze Spektrum an Funktionen, was du irgendwann brauchen könntest. Denn mit VB kommt jeder, der etwas "grösseres" schreiben will, irgendwann an die Grenzen.