ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于多线程进度条

关于多线程进度条

原创 Linux操作系统 作者:iDotNetSpace 时间:2009-02-18 16:24:57 0 删除 编辑
最近项目中需要用到多线程调用进度条,用来显示文件拷贝或下载的进度,以前没有接触过多线程的实际应用,所以总是蹩手蹩脚的,好不容易实现了下面的多线程进度条,但是我想把它改进成,文件下载,拷贝,上传,请求webservice等工作都能调用的进度条窗体,现在还没有思路。

上代码:

1.WorkClass(实际完成工作的类):


<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->public class WorkClass
        {
            
//委托  
            public delegate void dWorkProgress(int size,int current);

            
public delegate void dWorkDone();
            
//事件
            public event dWorkProgress onWorkProgess;

            
//实际工作内容
            public void Start()
            {
                
for (int i = 0; i < 20; i++)
                {
                    Thread.Sleep(
250);
                    
if (onWorkProgess != null)
                    {
                        onWorkProgess(
20, i + 1);
                    } 
                }        
            }
        }

2.PSWaitingForm(等待的UI)


<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> public partial class PSWaitingForm : Form
    {
        
private ThreadStart threadstart;
        
//工作线程
        public Thread newThread;
        
        
public string Title
        {
            
get { return this.Text; }
            
set { this.Text = value; }
        }

        
public PSWaitingForm()
        {
            InitializeComponent();
        }

        
public void StartWork()
        {
            WorkClass worker 
= new WorkClass();
            worker.onWorkProgess 
+= new WorkClass.dWorkProgress(worker_onWorkProgess);
            
//触发事件
            worker.Start();
        }

        
//当工作完成后关闭PSWaitingForm
        void worker_onWorkDone()
        {
            
this.Close();
        }
        
//事件相应程序
        void worker_onWorkProgess(int total, int current)
        {
            
            
if (this.InvokeRequired)
            {
                
//若工作完成则通过异步调用委托来关闭PSWaitingForm窗体
                if (total == current)
                {
                    
this.BeginInvoke(new WorkClass.dWorkDone(worker_onWorkDone), null);
                }
                
//工作过程中异步调用委托来显示实际工作的进度
                this.BeginInvoke(new WorkClass.dWorkProgress(worker_onWorkProgess), new object[] { total, current });
            }
            
else
            {
                progressBar1.Maximum 
= total;
                progressBar1.Value 
= current;
                
            }
        }
      

        
private void PSWaitingForm_Load(object sender, EventArgs e)
        {
            threadstart 
= new ThreadStart(StartWork);
            newThread 
= new Thread(threadstart);
        }
        
//取消工作
        private void button1_Click(object sender, EventArgs e)
        {
            
if (newThread.IsAlive)
            {
                newThread.Abort();
                
this.Close();
            }
        }

       
    }

现在如果将上述的方法运用到文件下载中可以,如果再应用到上传或者其他过程中,就要逐一地修改PSWaitingForm内的方法,感觉很不合理,我比较菜,恳请达人相助!

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12639172/viewspace-555241/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-04

  • 博文量
    2376
  • 访问量
    5309395