Newsgroup: it.comp.lang.visual-basic
Titolo: [VB.NET]Listbox.items.add lenta ?

Buongiorno a tutti,
sto provando a popolare una listbox in vbnet.
Vorrei popolare una listbox con la lista dei processi in esecuzione su 
un'altro pc.
Ho quindi un programma server ed un client.
Il server manda la lista in formato testo dei processi al client che 
deve popolare la listbox
Nel client ho messo una textbox multinea per verificare i dati che 
arrivano e nel contempo popolo la listbox ma pur arrivandomi tutta la 
lista dei processi la listbox mi si popola di sole due/tre righe!
La listbox ï¿œ cosï¿œ lenta ?
la listbox e la textbox le popolo cosï¿œ:
lstprocess.items.add(Pid & " " & ProcName)
txtVerifica.text = txtVerifica.text & Pid & " " & ProcName
Boh.
Grazie, Alverman

 Boh.
La sfera di cristallo è a lucidare, "Boh" mi sembra la risposta giusta
Tutto quello che si vede dal tuo codice è che aggiungi una riga di
testo al ListBox, e una al TextBox...


Qualcosa sbagli.... con questo esempio, vengono caricati 1000 elementi in 
meno di un secondo
For i As Integer = 1 To 1000
    ListBox1.Items.Add(New ListItem(String.Format("{0:0000} - Testo di prova 
generato il {1}", i, Now), i))
Next
Cerca di scrivere codice un p� pi� .NET like ;-)
txtVerifica.Text &= String.Format("{0} {1}", Pid, ProcName)
-- 
Ciao, Vincenzo 

 
eh eh sto iniziando :)
Grazie, Alverman

 txtVerifica.Text &= String.Format("{0} {1}", Pid, ProcName)
Meglio ancora:
'immagino manchi anche un ritorno a capo in fondo
txtVerifica.SelectedText = String.Format("{0} {1}", Pid, ProcName)
Senza riconcatenare tutto il testo, molto più veloce

Senza riconcatenare tutto il testo, molto pi� veloce
Allora si potrebbe usare l'oggetto stringbuilder per tutte le operazioni e 
poi passare il suo contenuto alla casella di testo.
Ciao, Vincenzo 

 poi passare il suo contenuto alla casella di testo.
Ahimè no
La costruzione della stringa, in se, sarebbe più veloce, ma siccome
lui vuole vedere lo stato di avanzamento a video, sarebbe costretto a
ricopiare tutto il testo dallo stringbuilder al textbox ad ogni
iterazione.
A quel punto sarebbe nettamente controproducente a livello di
prestazioni e in più avrebbe anche problemi di refresh
Confronta queste due versioni (una form, un textbox multiline, due
bottoni)
Public Class Form1
   Private Sub Button1_Click(ByVal sender As System.Object , ByVal e
As System.EventArgs) Handles Button1.Click
      Dim rnd As New Random
      Dim start As Long
      Dim elapsed As TimeSpan
      Dim n As Integer
      TextBox1.Clear()
      start = Now.Ticks
      For i As Integer = 1 To 1000
         n = rnd.Next()
         TextBox1.SelectedText = String.Format("Numero {0}{1}", i,
Environment.NewLine)
      Next
      elapsed = New TimeSpan(Now.Ticks - start)
      Button1.Text = elapsed.TotalMilliseconds.ToString
   End Sub
   Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
      Dim rnd As New Random
      Dim start As Long
      Dim elapsed As TimeSpan
      Dim n As Integer
      Dim sb As New System.Text.StringBuilder(10000)
      TextBox1.Clear()
      start = Now.Ticks
      For i As Integer = 1 To 1000
         n = rnd.Next()
         sb.AppendFormat("Numero {0}{1}", i, Environment.NewLine)
         TextBox1.Text = sb.ToString
         'nota che questo, nell'altro caso, non serve
         TextBox1.Refresh()
      Next
      elapsed = New TimeSpan(Now.Ticks - start)
      Button2.Text = elapsed.TotalMilliseconds.ToString
   End Sub
End Class