как выполнить петлю n времена за 1 секунду

Я пытаюсь выполнить несколько инструкций или функцию N времена через одну секунду. Как я могу сделать это на Яве? Следующим образом...

//in one second
while(N)
{
  printf(".........");
  int x=0;
  printf("The value of x is ");
}

но вопрос на самом деле идет немного глубже.. Я пытаюсь подготовить пиксели вручную, и я не хочу никакие из вращений в секунду эффект... так в основном, он должен выполнить времена N в течение секунды (Но это сделано бесконечно),

заранее спасибо

7
Вы не можете быть уверены точно, сколько раз цикл управляет в вашей петле через одну минуту, если вы говорите о регулярном OS' s. Чтобы быть уверенными, вы нуждаетесь в RTOS или предполагаете его, измеряя время между каждым циклом.
добавлено автор Mert Akcakaya, источник
Если это - просто домашняя работа, можно использовать занятую петлю, проверяющую текущее время в каждое повторение
добавлено автор Juan Mendes, источник
I' m почти бесспорный, что плакат будет доволен ответами, которые бегут "соответственно близко" к секунде.
добавлено автор user166390, источник
Вы хотите, чтобы он управлял каждой суммой N через 1 секунду или как можно больше N точно через 1 секунду?
добавлено автор Adrian, источник

6 ответы

Вы никогда не можете быть уверены, что это произойдет точно N времена в секунду, но это идет как это:

long taskTime = 0;
long sleepTime = 1000/N;
while (true) {
  taskTime = System.currentTimeMillis();
  //do something
  taskTime = System.currentTimeMillis()-taskTime;
  if (sleepTime-taskTime > 0 ) {
    Thread.sleep(sleepTime-taskTime);
  }
}
5
добавлено
That' s не проблема - измеряют время задачи и вычитают его со времени сна. Я отредактирую ответ...
добавлено автор Dariusz, источник
@pst вы говорите N <30, но почему won' t это работают т.е. на N=50? Я вижу проблему для N> 300, так как millis точность времени часто 3 мс.
добавлено автор Dariusz, источник
@pst хотят объявить о связи или чем-то? Мне удалось найти это: javamex.com/tutorials/threads/sleep.shtml но граф показывает это там shouldn' t быть любыми проблемами с продолжительностью сна
добавлено автор Dariusz, источник
Спасибо, в чем я нуждался:), чтобы не перестроить колесо
добавлено автор elrado, источник
Гнида: Это будет только работать приблизительно на меньший N (скажите 30 или меньше). Для большего N многократный N должен будет быть сделан каждый раз передо сном.
добавлено автор user166390, источник
Проблема isn' t точность/точность currentTimeMillis : проблема - минимальная продолжительность сна (который является намного больше), так как "делают что-то", как, предполагают, эквивалентен, чтобы "сделать один N". Я don' t вспоминают точные минимальные продолжительности урожая, но я прохожу "1/30-й из секунды" на Windows как правило. Это могло быть намного ниже на Linux, например.
добавлено автор user166390, источник
Хорошая связь, см.: "В Linux этот период перерыва обычно - 1 мс в недавних ядрах (2.6.8 вперед). В Windows, scheduler' s период перерыва обычно приблизительно 10 или 15 миллисекунд" - таким образом, похоже, что мое правление было немного выключено на Windows и пути прочь на Linux;-)
добавлено автор user166390, источник
Проблема состоит в том, что, те инструкции наклоняются, выполняют в одном тиканье... Таким образом, мы можем заставить его спать для 1000/Н
добавлено автор JS_VIPER, источник

Я щелкнул бы проблемой: не ограничивайте петлю временами N за секунду. Вместо этого процесс N единицы работы равномерно распределяется за желаемое время.

Таким образом, вычислите, сколько времени прошло начиная с начало (или предыдущая работа ), интерполируйте это в , производительность и делает так много работы (фактор во время начала/в предыдущий раз и объем работы, который был сделан). Это - фундаментальное подкрепление многих двигателей игры/анимации - a "время дельты".

Тогда звоните урожай в конце каждой петли, чтобы "быть хорошим" - или скорее предотвратить еду 99% + использование центрального процессора! У самого урожая есть минимальное разрешение <глоток> 1 , но эффекты обычно соответствуют, особенно интерполируя соответственно.

Поскольку подход интерполяции используется, это должно работать на весь N (что может пробег в выделенное время), даже если это означает делать еще много N каждая петля. Также возможно, что никакая работа не могла бы быть сделана никакая конкретная петля для маленького N, но , урожай делает этот вид "дополнительного занятого перекручивания" дешевым с точки зрения загрузки ЦП <глоток> 2 .


Вот некоторый псевдокод, чтобы распечатать 20 "x" s за секунду, куда теперь возвращает доли секунды:

rate = 20      //per second - "N times per second"
done = 0
goal = 1 * rate//same as rate for 1 second
start = now()
while done < goal:
    target = floor((now() - start) * rate)
    work = (target - done)//work might be 0, that's okay
    for 0 upto work:
         print("x")
    done += work
    yield()

В этом случае легко интерполировать прочь времени начала из-за постоянной формулы уровня. Используя "время дельты", базирующееся от времени, так как, последняя работа (или петля) подобна и подходит, когда нет никакой дискретной формулы, но не немного более сложна и может привести к тонким ошибкам дрейфа.


1 The time resolution of an actual sleep/yield is implementation-dependent and varies by by system. For instance, it might range from as low as 1ms on Linux to 10-15ms on windows.

2 In addition to dealing with a time delta, the sleep period can be altered, as per Dariusz Wawer's answer. However, this adds complexity and a simple yield is often sufficient.

4
добавлено

Трудно быть точным с предлагаемыми решениями. Вместо вычисляют промежуток между повторениями, вычисляют абсолютное время, когда следующее повторение должно быть выполнено. Это более точно, потому что повторения не зависят от предыдущих.

long startTime = System.currentTimeMillis();
long msPerIteration = 1000000/iterationsPerSecond;
long i=0;
while (true) {
   //do stuff

    long msWaiting = startTime + (msPerIteration * ++i) - System.currentTimeMillis();

    if (msWaiting > 0)
        Thread.sleep(msWaiting);
}
1
добавлено

Измените петлю, чтобы в то время как (верный) .

Проверьте время в миллисекунды перед вашим в то время как петля. В конце , в то время как петля получают время в миллисекундах и видят, прошли ли 1000 из них. Раз так разрыв .

0
добавлено
Я неправильно понял вопрос. Из того, что я понимаю, то, что вы хотите, чтобы петля выполнила точно N времена в конкретную секунду.
добавлено автор Krystian Cybulski, источник
Таким образом, это... выполнит в течение секунды независимо от того, сколько раз повторяется петля. That' s не, каков пункт был, не так ли?
добавлено автор Dariusz, источник
Это помогает..., но вопрос на самом деле идет немного глубже.. Я пытаюсь подготовить пиксели вручную, и я не хочу никакие из вращений в секунду эффект... так в основном, он должен выполнить времена N в течение секунды (Но это сделано бесконечно),
добавлено автор JS_VIPER, источник

Псевдо код:

Create Timer t;
t.Start;
int counter = N;
While ((t.Elapsedtime < 1 Second) AND (N > 0))
{
    call your_function();
    N--;
}

your_function()
{
    printf(".........");
    int x=0;
    printf("The value of x is ");
}
0
добавлено
long start = System.currentTimeMillis();
while (System.currentTimeMillis() - start <= 1000) {
 //Your code goes here
}

Все это заботится, - то, что ваш код будет закреплен петлей для 1000 миллисекунд. Число раз это сделано, сомнительно и может измениться на каждом пробеге.

0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async