Progressbar bremst mein Programm ! ?

Hallo.
Ich habe eine Datei die 4 "Spalten und 70000 zeilen hat in ein Array eingelesen um mit diesen daten schnellstmöglich zu arbeiten. Das funktioniert auch alles gut. nun wollte ich aber sollange eine euche durch das Array läuft ein Progressbar füllen und plötzlich braucht die Suche statt 1-3 Sekunden nun 5-6. Wie kann es sein das hier do gebremst wird ?

For I = 0 To 70000
Progzähler = Progzähler + 1
ProgBalken (Progzähler)
If BSCBSArray2(I, 1) = TextBox1.Text Then TroubleId = BSCBSArray2(I, 2)
If BSCBSArray2(I, 1) = TextBox1.Text Then WartungsId = BSCBSArray2(I, 3)
Next I

Andere frage: Passt sich eine String variable an die größe des inhalts an? oder belegt sie immer den komplett möglichen platz im speicher ?
Ansonsten wäre eine Variable die Max 999999999 darstellen kann besser ?
Single oder Long ? oder ist das egal welchen Typ ich für einen wert von 0-999999999 nehme ?

Hallo Joe,

Wie kann es sein das hier do gebremst wird ?

For I = 0 To 70000
Progzähler = Progzähler + 1
ProgBalken (Progzähler)
If BSCBSArray2(I, 1) = TextBox1.Text Then TroubleId =
BSCBSArray2(I, 2)
If BSCBSArray2(I, 1) = TextBox1.Text Then WartungsId =
BSCBSArray2(I, 3)
Next I

Der Progressbar muss angezeigt werden. Die Bildaktualisierung frisst die Zeit.

Wozu Progzähler? Da reicht auch das i.
Aktualisiere einfach den balken nicht so oft, dann bremst er nicht so stark.

If i Mod 100 = 0 Then Progbalken.Value = i

Andere frage: Passt sich eine String variable an die größe des
inhalts an?

Ja, wenn Du die Länge nicht festlegst.

oder belegt sie immer den komplett möglichen platz im speicher ?
Ansonsten wäre eine Variable die Max 999999999 darstellen kann
besser ?
Single oder Long ? oder ist das egal welchen Typ ich für einen
wert von 0-999999999 nehme ?

Für Single oder Integer ist der Wert zu groß. Single oder Double brauchst Du nur, wenn Du Dezimalstellen brauchst. Das sieht nach Long aus. :smile: Das ist natürlich schneller als ein String, denn wenn Du eine Zahl verwenden willst muß die ja erst noch umgewandelt werden. Die Verwaltung von Strings verbraucht auch deutlich mehr Rechenzeit und Speicher.

Um ein Stringarray zu verwalten wird für jeden einzelnen String ein Speicherbereich reserviert. Da nimmt das System einfach etwas, wo noch Platz ist. Wo sich dieser Speicherbereich befindet, wird in einem Array aus ebensovielen Asressen gespeichert, wie das Stringarray elemente hat. Die Speicheradressen haben den Typ Long. Der Platz für das Array aus Long-werten verbrauchst Zu für Strings also noch zusätzlich, nur daß da dann nicht Deine Werte gespeichert sind, sondern die Adressen, an denen sich Deine Daten befinden.

Deine Suche dauert für meinen Geschmack ohnehin zu lang. Für 70 000 Zeilen eine Zeit im Sekundenbereich ist zu viel. Musst Du das Array mehrfach durchsuchen? Darf man das eventuell vorher sortieren und dann iterativ suchen? Das könnte um ein Vielfaches schneller sein und Du kannst Dir den Progressbalken eventuell sparen.

Gruß Rainer

Da ich alle Daten aus einer Datei einlese müsste ich nach dem teilen die Daten vom String in Long convertieren. Gibt es da ne einfache lösung. Der Input aus der Datei sieht wie folgt aus:
111222333 112333444 444555333 233444333

und hier ist das problem :
BSCBSArray2(Y, X) = BSCteil(X)
BSCBSArray2 ist nun LOng und BSCteil = String
_--------------------------------
BB = FreeFile
Open App.Path & „\import\BSCBS.txt“ For Input As #BB
While Not EOF(BB)
Line Input #BB, BSCBS

BSCteil = Split(BSCBS, Chr(9))
For X = LBound(BSCteil) To UBound(BSCteil)
BSCBSArray2(Y, X) = BSCteil(X)
Next
Y = Y + 1

Wend
Close #BB

Hallo Joe,

Da ich alle Daten aus einer Datei einlese müsste ich nach dem
teilen die Daten vom String in Long convertieren. Gibt es da
ne einfache lösung. Der Input aus der Datei sieht wie folgt
aus:

ich kürze mal:

BSCBSArray2(Y, X) = BSCteil(X)

Wenn Du da schreibst:

BSCBSArray2(Y, X) = Cdbl(BSCteil/X))

schreibst Du den Wert als Double in das Array.

Line Input wäre mir zu langsam. Das Thema hatte ich kürzlich erst. Der Code …

/t/vb6-stringvariable-parsen/5792309/7

Gruß Rainer

Hallo,

was mir da gerade noch auffällt …

Der Input aus der Datei sieht wie folgt
aus:
111222333 112333444 444555333 233444333

sind das Koordinaten, oder warum willst Du das in ein mehrdimensionales Feld schreiben? Mit einem eindimensionalen Feld hast Du deutlich weniger Ärger.

Gruß Rainer

Nein Nein.
Es ist eine folge von Zahlen
TechnikID Seriennummer TroubleID undnochneID
Ich habe aber noch das PRoblem das ich den BSCteil (String) nicht in das BSCBSCArray bekommen (long) hmpf trotz CDbl.
Das mit dem Komplette einlesen muss ich noch einbauen, es gefällt mir sehr gut. werde das nochmal testen.

BB = FreeFile
Open App.Path & „\import\BSCBS.txt“ For Input As #BB
While Not EOF(BB)
Line Input #BB, BSCBS

BSCteil = Split(BSCBS, Chr(9))
For X = LBound(BSCteil) To UBound(BSCteil)
BSCBSArray2(Y, X) = BSCteil(X)
'BSCBSArray2(Y, X) = CDbl(BSCteil(X))

Hi Joe,

Ich habe aber noch das PRoblem das ich den BSCteil (String)
nicht in das BSCBSCArray bekommen (long) hmpf trotz CDbl.

BB = FreeFile
Open App.Path & „\import\BSCBS.txt“ For Input As #BB
While Not EOF(BB)
Line Input #BB, BSCBS

BSCteil = Split(BSCBS, Chr(9))
For X = LBound(BSCteil) To UBound(BSCteil)
BSCBSArray2(Y, X) = CDbl(BSCteil(X))

Wenn in BSCteil(n) tatsächlich immer nur Zahlen stehen und BSCBSArray2(x,y) richtig als Long deklariert ist, läuft das so.

Fehlerquellen:

  • Tippfehler beim Namen. Deine Namen sind so kryptisch, da vertippt man sich schnell mal.
  • Datenfehler. Sobald ein Feld keine Zahl enthält, ein Buchstabe oder ein Leerzeichen genügt, stürtzt das ab.

Was sagt der Debugger? Fehler vor dem Start oder bei einem bestimmten Wert? Wenn Wert, welcher? Wenn es an den Daten liegt, welches Verhalten ist dann erwünscht? Man kann ein Feld ignorieren, einen Datensatz verwerfen oder auch die gesamte Tabelle.

Gruß Rainer

Hallo Joe,

etwas fällt mir noch auf.

BB = FreeFile
Open App.Path & „\import\BSCBS.txt“ For Input As #BB
While Not EOF(BB)
Line Input #BB, BSCBS

woher weißt Du, wieviele Zeilen es werden?

BSCteil = Split(BSCBS, Chr(9))
For X = LBound(BSCteil) To UBound(BSCteil)
BSCBSArray2(Y, X) = CDbl(BSCteil(X))

Das Y in BSCBSArray ist nicht variabel. Da stehen die Zeilen. Du müsstest also vor den ersten Lineinput wissen, wieviele Zeilen es werden. Wo wird das Array deklariert? Diese Stelle des Codes würde mich interessieren.

Gruß Rainer

OH Oh … jetzt muss ich meinen sehr speziellen Code preisgeben…
Das ist erstmal der ganze Code der hierfür notwendig ist.

An der Frischen Luft habe ich gerade die Vermutung das in BSCteil nicht immer was drinsteht … also kann es sein das BScteil(1) oder BScteil(2) mal den Inhalt = „“ hat.
ich melde mich

Public BSCBSArray2(80000, 4) As String
'Public BSCBSArray2(80000, 4) As Long

Private Sub LoadBSData()
Dim BB As Integer
Dim BSCBS As String

Dim BSCteil() As String

Dim X As Integer
Dim Y As Long

X = 0
Y = 0

BB = FreeFile
Open App.Path & „\import\BSCBS.txt“ For Input As #BB
While Not EOF(BB)
Line Input #BB, BSCBS

BSCteil = Split(BSCBS, Chr(9))
For X = LBound(BSCteil) To UBound(BSCteil)

BSCBSArray2(Y, X) = BSCteil(X)

'MsgBox „-“ & BSCBSArray2(Y, X) & „-“ & BSCteil(X) & „-“

'BSCBSArray2(Y, X) = CDbl(BSCteil(X))

Next
Y = Y + 1

Wend
Close #BB

End Sub

Das hätte ich sehen müssen !! ARGH !!
If BSCteil(X) = „“ Then

Else
BSCBSArray2(Y, X) = CDbl(BSCteil(X))
End If

Das hilft !!

sorry & Danke. Das problem wäre geklärt. aber eins hätte ich noch :stuck_out_tongue:

Hi,

Das hätte ich sehen müssen !! ARGH !!
If BSCteil(X) = „“ Then

Else
BSCBSArray2(Y, X) = CDbl(BSCteil(X))
End If

Das hilft !!

OK. Wenn Du nicht auf „“ prüfst, sondern auf ‚IsNumeric()‘ …

If IsNumeric(BSCteil(X)) = False

Else
'zuweisen
Endif

… erschlägst Du nicht nur „“ sondern auch " " und „a“

sorry & Danke. Das problem wäre geklärt. aber eins hätte ich
noch :stuck_out_tongue:

OK. :smile:

Gruß Rainer