2015-01-07 2 views
-1

Я хотел бы визуализировать, как очередь при доступе к двум потокам чтения и потоку писателя растет и сжимается с помощью панели прогресса в 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; 


     } 
    } 
    } 
+0

Не знаете, в чем ваш вопрос. Что такое «Минимальный» и «Максимальный» диапазона выполнения? И что самое важное, вы когда-нибудь добавляли в игру «Больше»? –

+0

Мне никогда не удавалось добавить что-либо в очередь, но индикатор прогресса растет примерно на 10% от бара. Моя первая мысль заключалась в том, что в progressbar migh есть некоторые настройки, которые мне нужно настроить, например: увеличьте длину полосы до 100 и чтобы она была заполнена на 10%, когда один элемент добавлен в очередь. Есть ли в этом смысл? – AV67

+0

Мой хрустальный шар говорит, что max = 10 и progressbar1.Maximum = 100. Дико неуместный UI бит, чем больше значение * меньше * прогресс, который вы сделали. –

ответ

0

Двойная проверка переменной длины, используйте вместо этого счетчик. Измените настройку по умолчанию для Progressbar для максимального размера от 100 до 10, чтобы соответствовать размеру очереди Toys. В методе 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; 

     } 
    } 
} 
Смежные вопросы