Question

Threading & updating controls

Asked by: Xavior2K3

Hi there,

I've got a ListView that I want to populate with thousands of records from a database. I'd like to do this in another thread so the user can modify certain criteria while the thread is still running. Any modifications would stop that thread, clear the list view and restart the thread.

I'm a little unsure how to do this, and if it is okay accessing the list view control from another thread. Any help would be greatly appreciated.

Many thanks.

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2009-06-22 at 02:34:57ID24510589
Tags

Threading

,

Database

Topics

Microsoft Visual Basic.Net

,

.NET

Participating Experts
3
Points
500
Comments
10

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. Fastest way to Populate Listview
    Hi, I'd like to know methods of the fastest way I can populate a listview without freazing the application and be able to clear. 4R.
  2. ListView and SendMessage
    I have a ListView in C# but needed to do some code in delphi, so i made a Dll in delphi and pass it the ListView handle. i can add items, using the listview handle, but any items i do add are not in ListView.Items, so is there a way to populate Items with the actual items in...
  3. Populating A ListView Quickly
    I have a listview that I populate with a list of files in a directory specified by the user. One particular directory that users often refer to contains 4000+ files, but it takes forever to populate the listview (using ListItems.add). When I view that same directory using E...
  4. Change the speed of populating listview
    I'm using VB.net as the front end and sql server as the back end, windows XP operating system. I have an an application where I retrieve transactions from a device(about 200 a time) and then populate the listview with that transactions one by one. Since the retrieval is so fa...

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: jpaulinoPosted on 2009-06-22 at 03:16:38ID: 24680975

Here is an example how to start a thread, using a delegate, to allow you to fill the listview.

You can abort the thread if you want and clean the itens of the user do anything.

Imports System.Threading
 
 
Public Class Form1
 
    Delegate Sub lvDelegate()
 
    ' Call the delegate
    Private Sub lvThreadMain()
        If Me.InvokeRequired Then
            Me.Invoke(New lvDelegate(AddressOf UpdateListView))
        End If
    End Sub
 
    ' Update Listview Code
    Private Sub UpdateListView()
 
        ' update code to update the thread here
 
    End Sub
 
    ' Form Load Event
    Private Sub frmFloatingWindow_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim lvThread As New Threading.Thread(AddressOf lvThreadMain)
        lvThread.Priority = ThreadPriority.Highest
        lvThread.IsBackground = True
        lvThread.Start()
    End Sub
 
End Class
                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:

Select allOpen in new window

 

by: jpaulinoPosted on 2009-06-22 at 03:18:25ID: 24680985


"update code to update the thread here" was a typo :)

 

by: Xavior2K3Posted on 2009-06-22 at 04:25:16ID: 24681300

So would I perform the database fetching and list view filling in the UpdateListView function. And would that method be running asynchronously so user interaction with the form is still functional? What does the Me.InvokeRequired mean?

How would you go about safely aborting and restarting the thread?

 

by: jpaulinoPosted on 2009-06-22 at 04:56:08ID: 24681508

This will not improve the filling process but allows the user work in the form while the list is updating. You must also add an Application.DoEvents after each line insert.


It's not usual and not practival to add some many records to the listview, but if you want to improve the performance, you can fill in virtual mode. Check some information:

http://www.codeproject.com/KB/list/ListViewVirtualMode.aspx
http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.virtualmode.aspx

 

by: CodeCruiserPosted on 2009-06-22 at 06:35:59ID: 24682251

Sorry to interrupt but would it be a good idea to use the backgroundworker?

 

by: Idle_MindPosted on 2009-06-22 at 09:57:04ID: 24684269

@jpaulino...your code there isn't multithreading UpdateListView() at all!   =\

You create a secondary thread in lvThreadMain()...so far so good.

But then you told the secondary thread to Invoke UpdateListView() using "Me" as the source.  The code basically says:

    Find the thread that created "Me" (the Form), and then run the delegate I pass (UpdateListView) on that same thread.

So the end result is that UpdateListView() is back running on the main UI thread!

This is quite evident if you change your code to:
(click the button then continuosly drag the form around by the title bar as you watch the debug messages)

Imports System.Threading
Public Class Form1
 
    Delegate Sub lvDelegate()
 
    Private Sub lvThreadMain()
        Debug.Print("Secondary Thread Sleeping...")
        System.Threading.Thread.Sleep(10000) ' this will NOT lock the Form up!
 
        If Me.InvokeRequired Then
            Debug.Print("Invoking UpdateListView")
            Me.Invoke(New lvDelegate(AddressOf UpdateListView))
        End If
    End Sub
 
    ' Update Listview Code
    Private Sub UpdateListView()
        Debug.Print("Sleeping in UpdateListView")
        System.Threading.Thread.Sleep(10000) ' this WILL lock the Form up!
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim lvThread As New Threading.Thread(AddressOf lvThreadMain)
        lvThread.Priority = ThreadPriority.Highest
        lvThread.IsBackground = True
        lvThread.Start()
    End Sub
 
End Class
                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:

Select allOpen in new window

 

by: jpaulinoPosted on 2009-06-22 at 16:03:10ID: 24687428

@Idle_Mind,

You're right ... my bad. I didn't even test it!

 

by: jpaulinoPosted on 2009-06-22 at 16:19:00ID: 24687517

But if you use a Thread to update the ListView in background, it will blink the ListView Items, because you're updating the UI several times. I think that using Virtual Mode it's best solution for this OR fill the list with less items.

Here's an corrected version of the thread, but it blinks the Listview. :(

@Idle_Mind,

Is there any way to correct this blink ?

Imports System.Threading
 
Public Class Form1
 
    Dim lvThread As Thread
 
    Delegate Sub lvDelegate(ByVal item As ListViewItem)
    Private performUpdate As New lvDelegate(AddressOf UpdateListView)
 
 
    Private Sub lvThreadMain()
 
        For x As Integer = 0 To 1000
 
            Dim newItem As New ListViewItem
            newItem.Text = x.ToString
            newItem.SubItems.Add(Now.ToLongTimeString())
 
            performUpdate.BeginInvoke(newItem, Nothing, Nothing)
            Thread.Sleep(50)
        Next
 
    End Sub
 
 
    Private Sub UpdateListView(ByVal item As ListViewItem)
 
        If Me.InvokeRequired Then
            Dim d As New lvDelegate(AddressOf UpdateListView)
            Me.Invoke(d, New Object() {item})
        Else
            Me.ListView1.Items.Add(item)
        End If
 
        Debug.WriteLine("Done!")
    End Sub
 
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        lvThread = New Thread(AddressOf lvThreadMain)
        lvThread.Priority = ThreadPriority.Highest
        lvThread.IsBackground = True
        lvThread.Start()
    End Sub
 
End Class

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:

Select allOpen in new window

 

by: Idle_MindPosted on 2009-06-22 at 18:02:22ID: 24687998

Yah...not sure if there is a way to prevent the flickering when adding on the fly like that.  It's not recommended anyhoo since adding items constantly isn't much better than tying up the UI thread in the first place.

The virtual mode suggestion looks great...will have to play with it.  =)

(If you don't have .Net 2.0 or higher then you could only load a small subset of the records at once and then provide "next/previous" page buttons for the user...basically a manual implementation of the virtual mode)

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...