Listview

K

Ken

I have a listview with 24 rows and 150 columns. I update 3 rows every 10
seconds.

1 2 3 4 ... 150
row1
row2
row3
row4
..
..
..
row24

When this update occurs, I get a processor "spike" of 100% for a total of 7
seconds each update. This "spike" appears to use all of the processor which
is having adverse effects on other threads in the application (losing data,
failed communications, etc..).

I wrote example listviews in Visual C++ 6, Visual Basic 6, and VB .NET. Each
listview performed the same task - update 3 rows every ten seconds.

C++ and VB 6: There was a very small bump in processor usage - around 10% -
12%.
VB .NET: There was a spike of 60% - 70%.

It appears that updating a listview - in VB .NET - can be very expensive.

Has anyone else noticed this problem?
Is there a way to present the data this way without causing the processor
"spike" in VB .NET?
Why is there such a big difference between C++6,VB6, and VB .NET?

Thanks for your help.

K
 
S

Shane

Have you tried turning off the painting until all three rows are
updated?

listviewName.BeginUpdate()
Do your updating here
listviewName.EndUpdate()

Shane
 
C

Cor Ligthert [MVP]

Ken,

Can you tell us how long processing of this code takes.

Just a new project a listview on it and than this in the loadevent

\\\
ListView1.View = View.Details
For i As Integer = 1 To 150
ListView1.Columns.Add(i.ToString, 40, HorizontalAlignment.Left)
Next
Dim start As Integer = Environment.TickCount
ListView1.BeginUpdate()
For j As Integer = 1 To 24
ListView1.Items.Add(j.ToString)
For i As Integer = 1 To 150
ListView1.Items(j - 1).SubItems.Add(i.ToString)
Next
Next
ListView1.EndUpdate()
MessageBox.Show((Environment.TickCount - start).ToString & "Ms")
///

I hope this helps,

Cor
 
K

Ken

Thanks.

Yes, I tried it and it gives a wicked flicker of the entire list control.
No (good) change in processor usage.
 
K

Ken

Thanks. The test I conducted with the code below takes approx 120
milliseconds.

I have added something to the code that makes it more or less a mirror of
what I am doing. It is listed below. It takes much more time. Any major
problems with it that you can see?

Added a timer and set the interval to 10000 ms.
Inside the timer method:

Dim start As Integer = Environment.TickCount
ListView1.BeginUpdate()
For j As Integer = 1 To 24
For i As Integer = 1 To 150
ListView1.Items(j - 1).SubItems(i).Text = i.ToString
Next
Next
ListView1.EndUpdate()
MessageBox.Show((Environment.TickCount - start).ToString & "Ms")

I also changed your code snippet to add all 0's upon startup. This is how my
app currently functions.
 
K

Ken

I have been testing your scenario some more. I have come up with a 70-80
millisecond time when loading. Just a FYI. 120 to 80 Ms is a big difference.
 
J

Jim Underwood

Just curious,
Are you doing this as a client app or as a web app with a server side
control?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top