设置进度条的最大值以匹配队列长度。

时间:2015-01-07 12:45:49

标签: c# multithreading progress-bar

我想通过mainform中的进度条帮助可视化两个读取器线程和写入器线程访问的队列如何增长和缩小。我将使用委托来调用主窗体中的进度条,并将其值设置为Queue.Value(Toys.lenght)。进度条的行为不如所述,它不会一直增长,而长度变量也不会。

     public class Buffer
     {
        private delegate void Display(int v, ProgressBar f );
        private Queue<Toy> Toys = new Queue<Toy>(); 
        private object MyLock = new object();
        private int max;
        private int lenght; 
        private ProgressBar progressbar1; 
        public Buffer(ProgressBar r)
        {
            this.progressbar1 = r; 
            this.max = 10;
            this.lenght = Toys.Count; 

        }
        public void writeMethod(Toy toy)
        {
            lock (MyLock)
            {
               if (Toys.Count == max)
               {
                   Monitor.Wait(MyLock); 
               }

               Toys.Enqueue(toy); 
               Monitor.PulseAll(MyLock);  
                progressbar1.Invoke(new Display(Disp), new object[] {Toys.Count, progressbar1});
                MessageBox.Show("Que contains these items" + lenght); 

            }

        }

        public void readMethod()
        {
            lock (MyLock)
            {
                if(Toys.Count == 0)
                {
                    Monitor.Wait(MyLock); 
                }
                Toys.Dequeue(); 
                Monitor.PulseAll(MyLock); 
            }

        }
        public void Disp(int I, ProgressBar l)
        {
            progressbar1.Value = I; 


        }
    }
  }

1 个答案:

答案 0 :(得分:0)

仔细检查变量lenght,改用count。更改进度条默认设置,最大大小从100到10,以匹配队列玩具的大小。在Disp方法中,从= I变为+ = I;

   {
    public class Buffer
    {
        private delegate void Display(int v, ProgressBar f );
        private Queue<Toy> Toys = new Queue<Toy>(); 
        private object MyLock = new object();
        private int max;
        private int lenght; 
        private ProgressBar progressbar1; 
        public Buffer(ProgressBar r)
        {
            this.progressbar1 = r; 
            this.max = 10;
            this.lenght = Toys.Count; 

        }
        public void writeMethod(Toy toy)
        {
            lock (MyLock)
            {
               if (Toys.Count >= max)
               {
                   Monitor.Wait(MyLock);
               }

               if(Toys.Count <= max)
               {
                   Toys.Enqueue(toy); 
                  progressbar1.Invoke(new Display(Disp), new object[] {Toys.Count, progressbar1});
               }

                Monitor.PulseAll(MyLock);


                MessageBox.Show("Que contains these items" + Toys.Count); 
            }
        }

        public void readMethod()
        {
            lock (MyLock)
            {
                if(Toys.Count == 0)
                {
                    Monitor.Wait(MyLock); 
                }
                Toys.Dequeue(); 
                Monitor.PulseAll(MyLock); 

            }

        }
        public void Disp(int I, ProgressBar l)
        {
            progressbar1.Value += I; 

        }
    }
}