Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 设置进度条的最大值以匹配队列长度。_C#_Multithreading_Progress Bar - Fatal编程技术网

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

C# 设置进度条的最大值以匹配队列长度。,c#,multithreading,progress-bar,C#,Multithreading,Progress Bar,我想在mainform中的progressbar的帮助下,想象一下当两个读线程和一个写线程访问队列时,队列是如何增长和收缩的。我将使用委托调用主窗体中的进度条,并将其值设置为Queue.value(Toys.lenght)。progressbar的行为不符合规定,它不会一直增长,而Length变量也不会一直增长 public class Buffer { private delegate void Display(int v, ProgressBar f );

我想在mainform中的progressbar的帮助下,想象一下当两个读线程和一个写线程访问队列时,队列是如何增长和收缩的。我将使用委托调用主窗体中的进度条,并将其值设置为Queue.value(Toys.lenght)。progressbar的行为不符合规定,它不会一直增长,而Length变量也不会一直增长

     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; 


        }
    }
  }
公共类缓冲区
{
专用代理无效显示(int v,ProgressBar f);
私有队列=新队列();
私有对象MyLock=新对象();
私人int max;
私人内部长度;
私人ProgressBar progressbar1;
公共缓冲区(ProgressBar r)
{
这是1=r;
这个最大值=10;
this.lenght=Toys.Count;
}
公共无效写入方法(玩具)
{
锁(MyLock)
{
如果(Toys.Count==最大值)
{
监视器。等待(MyLock);
}
玩具。排队(玩具);
Monitor.Pulsell(MyLock);
调用(新显示(Disp),新对象[]{Toys.Count,progressbar1});
MessageBox.Show(“Que包含这些项”+长度);
}
}
public-void-readMethod()
{
锁(MyLock)
{
如果(Toys.Count==0)
{
监视器。等待(MyLock);
}
玩具;
Monitor.Pulsell(MyLock);
}
}
公共无效显示(int I,ProgressBar l)
{
progressbar1.值=I;
}
}
}

再次检查变量lenght,改用count。将最大大小的Progressbar默认设置从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; 

        }
    }
}
{
公共类缓冲区
{
专用代理无效显示(int v,ProgressBar f);
私有队列=新队列();
私有对象MyLock=新对象();
私人int max;
私人内部长度;
私人ProgressBar progressbar1;
公共缓冲区(ProgressBar r)
{
这是1=r;
这个最大值=10;
this.lenght=Toys.Count;
}
公共无效写入方法(玩具)
{
锁(MyLock)
{
如果(Toys.Count>=最大值)
{
监视器。等待(MyLock);
}

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