2013-09-16 5 views
0

Я немного борюсь с концепцией о том, как реализовать некоторые тайминги.Java постепенно уменьшает число до достижения цели со временем

В принципе, мне нужно написать код, который будет эффективно выполнять разгон для запросов на огонь на сервер.

Чтобы пояснить далее, мне необходимо отправить запросы на сервер в течение 15-минутного периода нарастания. Через 15 минут необходимо сделать ставку 3 раза в секунду. В начале периода нарастания можно начинать с (скажем) 1 запроса каждые 3 секунды. Как он достигает 3 запросов в секунду, не имеет значения, но он не должен достигать этой скорости до 15 минут.

Мне нужна помощь в реализации этого как таймера. Мне нужна функция, которая вернет время ожидания перед отправкой следующего запроса.

Поэтому у меня есть цикл, как так:

  • Отправить запрос
  • Подождите й количество времени (где х возвращаются функцией)

Это происходит до 15 минут достигаются , в результате чего функция всегда возвращает значение 0,3 секунды (для достижения 3 запросов в секунду - предположение состоит в том, что запросы отправляются на 0 секунд, но это нормально ...)

The val ues: - Общее время нарастания. - Запросы в секунду в конце времени нарастания. - Запросы в секунду в начале времени нарастания.

Любая помощь будет оценена по достоинству.

ответ

1
/** 
* start is the moment the first request is sent (in ms) 
* end is the moment, in which the targetDelta should be reached (in ms) 
* targetDelta is the targeted period between two requests (0.3) 
* initDelta is the initial delta (1.0) 
*/ 
private int getWaitingPeriod(long start, long end, double targetDelta, double initDelta) { 
    double timePassed = (double) (System.currentTimeMillis() - start); 
    double progress = timePassed/(double) (end - start); 
    if(progress >= 1) return (int) (targetDelta * 1000); 
    return (int) ((targetDelta - (targetDelta - initDelta) * progress) * 1000); 
} 

Не проверено, но это то, что вы ищете?

редактировать: упс, забыл преобразования секунд мс .. Теперь тестируемых, например:

long start = System.currentTimeMillis(); 
    while(System.currentTimeMillis() < start + 10000) { //testing with 10 seconds 

     int wait = getWaitingPeriod(start, start + 10000, 1, 0.3); 
     System.out.println("waiting " + wait + "ms"); 
     try { 
      Thread.sleep(wait); 
     } catch(InterruptedException ex) {} 

    } 
+0

Это не работает для меня - просто возвращает значение -2147483648 – RobM

+0

Я был слишком преждевременным нажатием кнопки «Сохранить», вы проверили последнее редактирование? – brickBreaker

+0

Отлично работает. Спасибо :) – RobM

0

Вы можете начать с создания класса, который обрабатывает запросы отправляете, если это уже не так. Нечто подобное (это более объектно-ориентированный):

public class RequestSender { 

double startTime; 

    // ramp up time is in minutes 
double rampUpTime; 
boolean firstRequest; 
int requestPerSecBeforeTime; 
int requestPerSecAfterTime; 

RequestSender(double rampUpTime, int requestPerSecBeforeTime, int requestPerSecAfterTime){ 
    this.rampUpTime = rampUpTime; 
    this.requestPerSecAfterTime = requestPerSecAfterTime; 
    this.requestPerSecBeforeTime = requestPerSecAfterTime; 
    firstRequest=true; 
} 

public void sendRequest(){ 
    if (firstRequest){ 
     startTime = System.currentTimeMillis(); 
     firstRequest = false; 
    } 
    // do stuff to send requests 
} 

public double getWaitTime(){ 
    if ((System.currentTimeMillis() - startTime)/60000 > rampUpTime){ 
     return 1/requestPerSecAfterTime; 
    } 
    else { 
     return 1/requestPerSecBeforeTime; 
    } 
} 

}

Затем вы можете использовать этот объект в вашем коде:

RequestSender rs = new RequestSender(15, 1, 3); 
rs.sendRequest(); 
Thread.wait(rs.getWaitTime()); 
3

Поскольку вы не слишком озабочены точным образом ускоряется скорость, вы можете выбрать следующие допущения:

  1. Ставка будет линейно возрастать со временем
  2. Некоторые приближения и округление скорости нормально, до тех пор, пока мы не замедлится

Вы вступаете в момент времени = 0, и будет время = 15

В момент времени = 0 , ваша ставка (скажем) 1 раз в 3 секунды. В момент времени = 15 ваша ставка равна 1 раз в 0.3333 секунды Общее изменение от 0 до 15 (3 - 0,3333 =) 2,77777

Разделите это на 15, вы получите 0.1777777. Что это означает: если ваша ставка упала на 0.177777 каждую секунду, вы могли бы начать в 3 и в конечном итоге на 0,3333

Это показано на линейном графике, как это:

enter image description here

Таким образом, если у вас есть метод, который знает, как долго (в секундах) с момента запуска (x) вы можете вычислить, каков ваш текущий курс.

double computeRate(double secondsSinceStart) 
{ 
    return 3 * (-0.177777 * Math.floor(secondsSinceStart)); 
} 

Это вычисление - это количество секунд, которое вам нужно подождать.

Используя аналогичный принцип, вы можете предположить нелинейную кривую или изменить ее другими способами.

+0

Ницца, мне нравится этот путь, это действительно простой, но мощный! +1 – Marc

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