Multiple Thread Progress Bar Control
Introduction
This article presents a control that creates threads and displays the progress and any messages sent from the thread.
Background
Running multiple threads and seeing the status of where they are has been a tricky subject for quite a while. The main thing being that you could not access anything that is being controlled by the main (UI) thread. This includes all parts of the form you are displaying and the properties and variables on it.
The .Net framework 2.0 has helped clear up some of that with the introduction of the BackgroundWorker class. This class allows you to run some code on its own thread. This allows your UI to remain responsive while the code runs.
What It Does
This control can be easily modified to be used to monitor/control batch operations that can be done simultaneously. Some examples:
- File Transfers
- Image Processing
- Directory Processing
- Screen scraping
Each thread can send its own messages back to the container. The container shows those messages in a grid as the threads are running.
The thread container actually does throttling as well. Before you start the threads, you can set the number of threads you want to run concurrently. I hope to eventually make this property dynamic so that it can be changed on the fly.
What It Does Not Do
This control is designed for items that do not update the UI other than what is already displayed. If you need to render objects and update the screen, you will need to modify the way this works. That may be another article.
How it Works
Each thread is represented in a ThreadView which inherits from UserControl. This ThreadView contains a BackgroundWorker. When the ThreadContainer.Start method is called it creates as many threads as it can (either Concurrent or TotalThreads if it is less than Concurrent). The ThreadViews are docked to the top so that they are all displayed nicely and expand to the width of the ThreadContainer. After creating the new ThreadView and displays it and starts it. As it works it raises its JobEvent event. This passes the message to the container and the ThreadContainer stores it in its DataTable.
Each ThreadView contains a JobCompleted event that notifies the ThreadContainer that it is done.
http://www.codeproject.com/KB/progress/MultiThreadProgressBar.aspx


作者:wudi_1982
}
