C# 设置进度条的最大值以匹配队列长度。
我想在mainform中的progressbar的帮助下,想象一下当两个读线程和一个写线程访问队列时,队列是如何增长和收缩的。我将使用委托调用主窗体中的进度条,并将其值设置为Queue.value(Toys.lenght)。progressbar的行为不符合规定,它不会一直增长,而Length变量也不会一直增长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 );
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。还可以尝试一个更大或更小的玩具数组,看看它是否影响大小。好的,我理解,我刚刚做了这个,现在它工作得很好。非常感谢