【问题标题】:Set maximum value for the progress bar to match length of queue.设置进度条的最大值以匹配队列长度。
【发布时间】:2015-01-07 12:45:49
【问题描述】:

我想在主窗体中的进度条的帮助下,想象一个队列在被两个读取线程和一个写入线程访问时如何增长和缩小。我将使用委托来调用主窗体中的进度条并将其值设置为 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; 


        }
    }
  }

【问题讨论】:

  • 不确定您的问题。进度条的Minimum 和Maximum 设置为什么?最重要的是,您是否曾向 Toys 添加多个项目?
  • 我从未设法向 que 添加任何内容,但进度条增长了大约 10 %。我的第一个想法是进度条可能有一些我需要调整的设置,例如:将条的长度设置为 100,并且当将一个项目添加到队列中时,它应该填充 10%。这有意义吗?
  • 我的水晶球说 max = 10 和 progressbar1.Maximum = 100。顺便说一句,UI 非常不合适,值越大,您取得的进度越少。
  • progressbar1.Maximum 的值是多少?在调用之前检查它。 10 个项目是我认为是 100 的默认值的 10%。设置 this.progressbar1.Maximum = 10。还可以尝试更大或更小的玩具数组,看看它是否会影响大小。
  • 好的,我明白了,我刚刚做了这个,现在它工作得很好。非常感谢

标签: c# multithreading progress-bar


【解决方案1】:

仔细检查变量长度,改用计数。将最大大小的进度条默认设置从 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; 

        }
    }
}

【讨论】:

    猜你喜欢
    • 2012-07-03
    • 2022-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2012-09-27
    • 2015-07-09
    • 1970-01-01
    相关资源
    最近更新 更多