延迟执行1秒

时间:2012-03-08 11:29:43

标签: c++ delay sleep

所以我试图编写一个简单的基于刻度的游戏。我在Linux机器上用C ++编写。下面的代码说明了我正在努力实现的目标。

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 个答案:

答案 0 :(得分:6)

重申其他人已经陈述的具体例子:

假设您正在使用std::cout进行输出,则应在sleep命令之前调用std::cout.flush();。见this MS knowledgebase article.

答案 1 :(得分:4)

sleep(n)等待n秒,而不是n微秒。 另外,正如Bart所提到的,如果你要写入stdout,你应该在每次写入后刷新流 - 否则,在刷新缓冲区之前你不会看到任何内容。

答案 2 :(得分:2)

  

所以我试图编写一个简单的基于刻度的游戏。我在Linux机器上用C ++编写。

如果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帧)。

答案 3 :(得分:0)

我想在linux上你必须使用usleep(),它必须在ctime

中找到

在Windows中你可以使用delay(),sleep(),msleep()