Come si accelera questa routine?

mercoledì 23 luglio 2008 - 16.22

willy_80 Profilo | Senior Member

Nella listbox1 ho una serie lunghissima di items letti da un file e gli item sono composti così:
Esempio: X123Y456Z789
Voglio dividere le tre quote e inserirle ognuna nella rispettiva listbox.
Considerando che le coordinate potrebbero avere dei decimali non so esattamente in che posizione cascano i caratteri X,Y,Z e quindi li devo cercare.
Ora ho risolto così:

............................................................................................................
For i1=0 to ListBox1.Items.Count-1

'Lettura della riga del file
Lettura = ListBox1.Items.Item(i1)

'Divisione e lettura delle 3 quote
Posy = InStr(1, Lettura, "Y", Microsoft.VisualBasic.CompareMethod.Text)
PosZ = InStr(1, Lettura, "Z", Microsoft.VisualBasic.CompareMethod.Text)
QX = (Val(Mid(Lettura, 2, Posy - 1)))
QY = (Val(Mid(Lettura, Posy + 1, PosZ - 1)))
QZ = (Val(Mid(Lettura, PosZ + 1, Len(Lettura) - 1)))

'Aggiunta delle quote nelle listbox
ListX.Items.Add(QX)
ListY.Items.Add(QY)
ListZ.Items.Add(QZ)
Next
............................................................................................................

Il problema è che supera grandemente i 30 sec. coi miei file, è possibile accelerare questa routine?
Grazie

alexmed Profilo | Guru

Ciao
fai un test così:

Dim myString As String
Dim newString() As String

For i As Integer = 0 To Me.ListBox4.Items.Count - 1

myString = Me.ListBox4.Items(i).ToString
myString = myString.Replace("X", " ")
myString = myString.Replace("Y", " ")
myString = myString.Replace("Z", " ")

newString = Split(myString, " ", -1, CompareMethod.Text)

Me.ListBox1.Items.Add(newString(1))
Me.ListBox2.Items.Add(newString(2))
Me.ListBox3.Items.Add(newString(3))

Next

Io ho caricato 1000 Items e ci ha messo si e no un secondo.

Ciao

willy_80 Profilo | Senior Member

Ora provo ma in ogni caso io ho file da trattare composti da 80/100 mila righe

willy_80 Profilo | Senior Member

Grazie mille è molto più veloce e funziona benissimo

the_follet Profilo | Newbie

Ciao,
prova ad utilizzare i metodi BeginEdit ed EndEdit delle ListBoxes in cui aggiungi gli Items, dovresti velocizzare ancora di più l'operazione.

'Prima dell'inserimento
ListBox1.BeginEdit

'ciclo di aggiunta Items

'Una volta terminato l'inserimento di tutti gli Items
ListBox1.endEdit

alexmed Profilo | Guru

Ciao,
Sono andato a rivedermi gli esempi nella Guida in linea ed in base a ciò ho dato una ritoccatina al codice postato in precedenza

Dim newString() As String

For i As Integer = 0 To Me.ListBox4.Items.Count - 1

newString = Me.ListBox4.Items(i).ToString.Split(New [Char]() {"X"c, "Y"c, "Z"c})

Me.ListBox1.Items.Add(newString(1))
Me.ListBox2.Items.Add(newString(2))
Me.ListBox3.Items.Add(newString(3))

Next

Non ho idea se così è più veloce o meno
Non resta che provare!!

Ciao

PS
Non ho testato i metodi postati da "the_follet"

willy_80 Profilo | Senior Member

Ho provato i vari sistemi che avete postato e devo dire che sono molto validi.
Ho provato a dividere i dati e appoggiarli in tre matrici, poi ho scritto nelle listbox e ho misurato le tempistiche, premetto che il tempo totale è pressochè invariato.

I risultati sono:
con un file da circa 90mila righe
Poco più di 1 secondo per leggere il file, dividere le quote e scriverle nelle matrici.
Circa 25/30 secondi per scrivere le quote nelle tre listbox.

Si può accelerare la scrittura nelle listbox? sinceramente se penso che anche ieri ho avuto a che fare con un file da 350mila righe mi viene da piangere a pensare di dover aspettare 2 minuti per caricare il file.

alexmed Profilo | Guru

Ciao
Qui scatta la curisità essendo geometra
Ma da dove vengono stè coordinate?

Per quanto riguarda la velocità a questo punto non saprei. Il caricamento da file a listbox non è un problema della CPU che hai montato sul PC?

Potresti provare passando da un Database !!

Senza caricarlo nella ListBox ma solo leggendolo quanto ci mette?

Ciao

willy_80 Profilo | Senior Member

Queste coordinate provengono da un file creato da un sfw di rilevamento laser, es un mio cliente voleva riprodurre in marmo un cappello da alpino, l'ho rilevato col laser ed ho ottenuto un file di 88350 righe/punti ps.: il cappello fa circa 400X250 mm immagina tu quando vado a rilevare un bassorilievo da 1500X1000 mm....

alexmed Profilo | Guru

Ahhh ecco!!!
Ma non hai a corredo un SW che ti gestisce i dati?
Una volta che hai separato XYZ dove le tratti ? In AutoCAD???

willy_80 Profilo | Senior Member

Una volta suddivisi, visualizzo le viste xy,xz e yz dopodichè permetto all'utente di cancellare i dati non voluti.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5