思路如下:
举个例子,如果我想让进度条走的快一些(单纯的操作进度条,就是改它的value,在maxnum相同的条件下),那我让多个线程来共同完成,每个线程完成一段,在显示进度条的value 之前把每个进程运算到的值加在一起赋值给value,然后显示。代码如下:namespace WindowsApplication34
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Thread[] threadarray= new Thread[10];        //记录线程数目
        int numberThread = 0;        //记录每个线程运算到的值
        int[] SThread=new int[10];        private void Form1_Load(object sender, EventArgs e)
        {        }
        private void loopCount()
        {
            int  n = Convert.ToInt32(this.textBox1.Text);
            int tn = Convert.ToInt16(Thread.CurrentThread.Name);            int p = 0;            int MinNum = 0;
            int MaxNum = n;
                        if (this.progressBar1.InvokeRequired)
            {
                this.progressBar1.Invoke((MethodInvoker)delegate { this.progressBar1.Minimum = MinNum;this.progressBar1.Maximum = MaxNum;});
            }            
            if(tn==numberThread)
            {
                p=n/(numberThread)+n%(numberThread);
            }
            else
            {
                p = n / (numberThread);
            }            
            for (int i = 0;i<=p;i++ )
            {
                SThread[tn] = i;                int s = 0;                for (int m = 0; m <= numberThread; m++)
                {                    s += SThread[m];
                }
                if (this.progressBar1.InvokeRequired)                    this.progressBar1.Invoke((MethodInvoker)delegate { this.progressBar1.Value = s; });
                else
                    this.progressBar1.Value = s;
            }                 
           
        }        private void buttonX1_Click(object sender, EventArgs e)
        {
            if (numberThread >= 0 && numberThread <= 9)
            {
                threadarray[numberThread] = new Thread(new ThreadStart(loopCount));
                threadarray[numberThread].Name = Convert.ToString(numberThread);
                threadarray[numberThread].Start();
                numberThread += 1;
            }
            else
            {
                MessageBox.Show("已经够10个线程了!!");
                return;
            }
            //Thread newthread = new Thread(new ThreadStart(loopCount));
            //newthread.Start();
            
        }
    }
}

解决方案 »

  1.   

    每个线程完成最后执行一下this.progressBar1.Value`++ 不就行了。不需要求和再设value。
      

  2.   

    to :scow(怡红快绿)
    这两天很忙,还没来的及实现。。
    To: xvting(xvting) 理论上是可以,我也认同你的观点。可实际上比我用单线程慢了不少。不知道为什么
    TO: 以后回复的人。其实怎么加到不重要,重要的是 ,一个进度条需要多个线程完成,的这个分配机制!!!
      

  3.   

    to: scow(怡红快绿) 本来想做一个文件传送,用多线程完成。估计这样能快点把。上面的代码是个简化版to: 以后回复的人在多线程完成同一个任务方面能给点建议吗(例如:讯雷什么的下载软件,不都是一个文件多个线程下载吗)。尽量是谈谈思路啊。能给个例子不胜感激。。E-MAIL:[email protected]   
      

  4.   

    我想有如下思路写一个基类,有一个公共的进度值变量
    写一个继承类,继承基类,进行改变进度值的工作写一个工作类,起一个线程池,线程池加载若干个,运行继承类的工作先模拟一下,如果可以,再赋值给UI线程
    ========================
    http://cache.monocn.com
      

  5.   

    to: commandown(它山之石)感觉你的思路不错。
      

  6.   


    To: xvting(xvting) 理论上是可以,我也认同你的观点。可实际上比我用单线程慢了不少。不知道为什么
    执行“ this.progressBar1.Invoke((MethodInvoker)delegate { this.progressBar1.Minimum = MinNum;this.progressBar1.Maximum = MaxNum;});“
    肯定很消耗时间的,需要等待。问题出在多线程的交互上!可以这样解决这个问题:(主要思想是避免多线程直接交互,我是这样解决的,哈哈)一个线程设置进度条的变化,不妨称它为主线程。其他若干线程计算值,但是若干线程各算各的,每个线程计算完成后将结果保存下来,(保存方式可以是数据库 或文件,最好是数据库,方便操作)。主线程周期访问库里的数据,并计算修改进度条。速度一点都不慢。
      

  7.   

    多线程直接交互的问题我遇到了,不过没有想到更好的办法解决。看了好多资料,都是通过线程sleep后操作另外一个线程。不过我不认为这个是好办法。所以我把线程交互统一抛到数据库里面去,因为数据库并发访问没有关系,呵呵以上仅供参考!同时学习其他人的方法!
      

  8.   

    to: AFatPig(大肥猪)其他若干线程计算值,但是若干线程各算各的,每个线程计算完成后将结果保存下来,(保存方式可以是数据库 或文件,最好是数据库,方便操作)。主线程周期访问库里的数据,并计算修改进度条。速度一点都不慢。
    =============================================估计数据库那也会很浪费时间,因为它面临的不是一次的存取,而且主线程的周期长短也造成显示的同步与速度的矛盾。如果长的话显示同步性就差,速度会快一点,如果短的话,同步会接近一点,速度就会明显的降下来。感觉你这个思路挺适合UI显示的。一次性完成,把UI显示单划出一个线程来。其他的计算或是操作放到别的多线程里,对了,感觉用异步就ok了,不用多线程了。--------个人观点,供大家讨论。
    这样把,关于多线程完成同一个任务的思路,拿个具体例子来说,就是讯雷的多个线程下同一个文件,并且在程序中也有个整体下载进度条。大家看看是怎么实现的,或者有什么更好的实现思路。
    (最初的那个程序只是想简化一下思路。)
      

  9.   

    肯定会比主线程慢.时间全浪费在线程间控制权的转移上了(这块主要由WINDOWS完成)