Задержка исполнения 1 секунда - PullRequest
5 голосов
/ 08 марта 2012

Итак, я пытаюсь запрограммировать простую тиковую игру. Я пишу в C ++ на машине Linux. Код ниже иллюстрирует то, что я пытаюсь достичь.

for (unsigned int i = 0; i < 40; ++i)
{
    functioncall();
    sleep(1000); // wait 1 second for the next function call
}

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

Я также попытался создать новую функцию с именем delay, и это выглядело так:

void delay(int seconds)
{
    time_t start, current;

    time(&start);

    do
    {
        time(&current);
    }
    while ((current - start) < seconds);
}

Тот же результат здесь. Кто-нибудь?

Ответы [ 4 ]

6 голосов
/ 08 марта 2012

Чтобы повторить то, что уже было сказано другими на конкретном примере:

Предполагая, что вы используете std::cout для вывода, вы должны вызвать std::cout.flush(); прямо перед командой sleep. См. эту статью базы знаний MS.

4 голосов
/ 08 марта 2012

sleep (n) ожидает n секунд, а не n микросекунд. Кроме того, как упомянул Барт, если вы пишете в stdout, вы должны очищать поток после каждой записи - иначе вы ничего не увидите, пока буфер не будет очищен.

2 голосов
/ 08 марта 2012

Итак, я пытаюсь запрограммировать простую тиковую игру.Я пишу в C ++ на машине Linux.

если functioncall() может занять значительное время, то ваши тики не будут равны, если вы спите столько же времени.

Возможно, вы пытаетесь это сделать:

while 1: // mainloop
   functioncall()
   tick() # wait for the next tick

Здесь tick() спит приблизительно delay - time_it_takes_for(functioncall), т. Е. Чем дольше functioncall() занимает меньше времени tick() спит.

sleep() спит целое число секунд.Вам может потребоваться более точное разрешение времени.Для этого вы можете использовать clock_nanosleep().

Пример реализации Clock :: tick ()

// $ g++ *.cpp -lrt && time ./a.out
#include <iostream>
#include <stdio.h>        // perror()
#include <stdlib.h>        // ldiv()
#include <time.h>        // clock_nanosleep()

namespace {
  class Clock {
    const long delay_nanoseconds;
    bool running;
    struct timespec time;
    const clockid_t clock_id;

  public:
    explicit Clock(unsigned fps) :  // specify frames per second
      delay_nanoseconds(1e9/fps), running(false), time(),
      clock_id(CLOCK_MONOTONIC) {}

    void tick() {
      if (clock_nanosleep(clock_id, TIMER_ABSTIME, nexttick(), 0)) {
        // interrupted by a signal handler or an error
        perror("clock_nanosleep");
        exit(EXIT_FAILURE);
      }
    }
  private:
    struct timespec* nexttick() {
      if (not running) { // initialize `time`
        running = true;
        if (clock_gettime(clock_id, &time)) {
          //process errors
          perror("clock_gettime");
          exit(EXIT_FAILURE);
        }
      }
      // increment `time`
      // time += delay_nanoseconds
      ldiv_t q = ldiv(time.tv_nsec + delay_nanoseconds, 1000000000);
      time.tv_sec  += q.quot;
      time.tv_nsec = q.rem;
      return &time;
    }
  };
}

int main() {
  Clock clock(20);
  char arrows[] = "\\|/-";
  for (int nframe = 0; nframe < 100; ++nframe) { // mainloop
    // process a single frame
    std::cout << arrows[nframe % (sizeof(arrows)-1)] << '\r' << std::flush;
    clock.tick(); // wait for the next tick
  }
}

Примечание. Я использовал std::flush() для обновленияВывод немедленно.

Если вы запустите программу, это займет около 5 секунд (100 кадров, 20 кадров в секунду).

0 голосов
/ 08 марта 2012

Я полагаю, в Linux вам нужно использовать usleep(), и оно должно быть найдено в ctime

А в Windows вы можете использовать delay (), sleep (), msleep ()

...