2014-11-18 3 views
0

Привет Я не понимаю, почему в мире этот цикл выполняется 3 раза в секунду. Это фактически код вычисления скорости загрузки, и он довольно прямолинейный. он измеряет байты, сделанные за предыдущие 1 сек, а затем добавляет их в список, затем усредняет все элементы в списке, а затем обновляет gui, а в последний раз спящий на 1 секунду.цикл выполнения 3 раза java

private void update() { 
    List<Float> list = new ArrayList<>(); 
    do { 
     float averageSpeed = 0; 
     // Calculating 
     // I have a multiple threads which are downloading this file in segments 
     // and all of them increment value of data.bytesDone when ever 
     // they download a portion of data so I calculate bytesDone in one sec 
     // and then take average of it using a list which contain speed values of 
     // previous 20 sec. 
     float speed = (data.bytesDone.get() - currentBytes); 
     currentBytes = data.bytesDone.get(); 

     System.out.println(speed); 

     list.add(speed); 
     if (list.size() > 20) { 
      list.remove(0); 
     } 
     for (Float increment : list) { 
      averageSpeed += increment; 
     } 
     averageSpeed /= list.size(); 

     // Updating Gui // 

     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } while (data.state.equals(State.ACTIVE) && data.bytesDone.get() != data.sizeOfFile); 
} 

EDIT: Ребята, я действительно не могу понять, почему этот цикл является скорость печати 3 раза в секунду он всегда должен печатать только один раз в секунду. TY

+0

Что такое 'data'? –

+1

Можем ли мы видеть полный код (возможно, ссылку на pastebin) – Coffee

+0

Ну его довольно большой класс с большим количеством материала, связанного с javafx gui. Я редактирую код, поэтому он более понятен. –

ответ

0

Вместо использования Thread.sleep (1000); Вы можете подумать об использовании этого бита.

сразу после делать {

long startMili = System.currentTimeMillis(); 

и вместо вашего всего Thread.sleep (1000) вещи положить это в.

long currentMili = System.currentTimeMilis(); 
while(currentMili - startMili < 1000){ 
    long currentMili = System.currentTimeMilis(); 
} 

Это обеспечит этот код будет цикл 1 раз в секунду ,

Если это не исправить, тогда у вас может возникнуть проблема с потоками, так как вы используете графический интерфейс. Как вы вызываете обновление? Есть только один поток, использующий update().

+0

Функция обновления обновления называлась 3 раза: P –

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