Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[VB.NET]Listbox.items.add lenta ?

24 views
Skip to first unread message

alverman

unread,
Dec 22, 2009, 9:36:29 AM12/22/09
to
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

Luca D

unread,
Dec 22, 2009, 1:21:08 PM12/22/09
to
On Dec 22, 3:36 pm, "alverman" <9702inva...@mynewsgate.net> wrote:
> 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...

VincePik

unread,
Dec 23, 2009, 5:23:12 AM12/23/09
to
> 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
>

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


alverman

unread,
Dec 23, 2009, 7:26:20 AM12/23/09
to
VincePik <TOGLI-ASTERISCHI-i*n*f*o...@monkeysoft.it> ha scritto:

> 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
>

In effetti sbagliavo io

> Cerca di scrivere codice un pᅵ piᅵ .NET like ;-)


>
> txtVerifica.Text &= String.Format("{0} {1}", Pid, ProcName)
>

eh eh sto iniziando :)

Grazie, Alverman

Luca D

unread,
Dec 23, 2009, 11:57:06 AM12/23/09
to
On 23 Dic, 11:23, "VincePik" <TOGLI-ASTERISCHI-i*n*...@monkeysoft.it>
wrote:

> 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

VincePik

unread,
Dec 24, 2009, 5:06:39 AM12/24/09
to
> 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

Allora si potrebbe usare l'oggetto stringbuilder per tutte le operazioni e
poi passare il suo contenuto alla casella di testo.

Ciao, Vincenzo


Luca D

unread,
Dec 24, 2009, 6:06:25 AM12/24/09
to
On 24 Dic, 11:06, "VincePik" <TOGLI-ASTERISCHI-i*n*...@monkeysoft.it>
wrote:

> Allora si potrebbe usare l'oggetto stringbuilder per tutte le operazioni e
> 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

0 new messages