Как правильно реализовывается интервал в C++?


1

Нужно каждые N миллисекунд увеличивать переменную. Нашёл только такой способ:

long t = time(0)

while (...) {
  if (time(0) > t) {
      ...
      t = time(0);
   }
}

Только это слишком медленно. Sleep внутри циклов не работает. Я что-то делаю не так, но не могу понять, что.

Как в C++ правильно сделать интервал без костылей?

Источник
c++
  •  38
  •  3
  • 25 янв 2018 2018-01-25 18:23:04
В time() и sleep() время в секундах, а в usleep() микросекунды. Почитайте также разделы NOTES и SEE ALSO в manpage по ссылке — 25 янв 20182018-01-25 19:15:48.000000
Покажите ваш код со sleep и расскажите, как определили, что он игнорируется. — 25 янв 20182018-01-25 18:42:22.000000
@АлексейПетродий, быть может интервал просто слишком мал, чтобы заметить остановку? — 25 янв 20182018-01-25 18:40:21.000000
Он будто игнорируется. Пробовал и в for и в while, результат один. Цикл внутри функции, которая бесконечно вызывается в main. Но я проверил, функция выполняется правильно, дожидаясь конца цикла. — 25 янв 20182018-01-25 18:37:19.000000
"Sleep внутри циклов не работает" В каком смысле? Можно подробнее? — 25 янв 20182018-01-25 18:29:23.000000

3 ответа

0

Всем спасибо за помощь. Извините, не разобрался. Перепутал функцию, виндовый Sleep принимает только миллисекунды. Я действительно слишком малое значение поставил.

2

Функции ожидания (sleep, usleep, sleep_for), не обеспечивают точного периода ожидания. Они гарантируют только, что период будет "не меньше" указанного пользователем. Проблема в том, что многие OS, включая windows, не являются real-time os. Т.е. если конец интервала придется на квант времени когда шедуллер уже отдал процессор другому процессу, работа твоей программы продолжиться физически не сможет.

Правильный способ - заменить обращение к переменной, на обращение к функции, и внутри функции вычислять результат на основе текущего времени. Либо довольствоваться "приблизительным" интервалом времени.

  • 26 янв 2018 2018-01-26 05:11:00
1

Попробуйте std::this_thread::sleep_for для c++11

  • 25 янв 2018 2018-01-25 19:24:57