程序中的定时器太慢

时间:2017-05-10 21:28:04

标签: c unistd.h

你好我正在创建一个speedcube计时器我只是把时间放在中心但后来我注意到它上面的时间太慢了,我尝试将usleep功能从1000更改但它要么快还是慢,任何想法?

#include <ncurses.h>
#include <stdlib.h>
#include <unistd.h>


int main()
{
  int minutes = 0, milliseconds = 0, seconds = 0, x = 0, y = 0, text = 6, textminutes = 0, textseconds = 0, textmilliseconds = 0;

  initscr();
  while(1)
    {
      /*This block of code centers the text on the screen by incrementing each variable by one
    for each number starting at ten, Then prints the time.*/
      getmaxyx(stdscr,y,x);
      if (seconds == 60 && minutes == 10){
    textminutes += 1;
      }
      if  (milliseconds == 1000 && seconds == 10){
    textseconds += 0;
      }
      if (milliseconds == 10){
    textmilliseconds += 1;
      }
      else if (milliseconds == 100)
    {
     textmilliseconds += 1;
    }
      else if(milliseconds == 1000)
       {
        textmilliseconds += 1;
       }
      int left_row = (x / 2) - (3 + textminutes + textseconds + textmilliseconds / 2);
      mvprintw(y/2, left_row,"%d : %d : %d", minutes, seconds, milliseconds);

      /*Sleep for 1 millisecond the increment the milliseconds
    var i don't think that the timing is right though. 
    Then it refreshes and clears the screen to fetch the new contents.*/
      usleep(1000);
      milliseconds++;
      if(milliseconds == 1000)
       {
         milliseconds = 0;
     textmilliseconds -= 2;
         seconds++;
     if(seconds == 60)
       {
        seconds = 0;
        textseconds -= 1;
        minutes++;
       }
       }       
      refresh();
      clear();
      }
  endwin();
  return(0);
}

2 个答案:

答案 0 :(得分:2)

您的代码似乎是在假设您的进程可以每毫秒可靠地运行一次的情况下编写的,但您可能正在必须执行其他任务的操作系统上运行它,因此您无法每毫秒运行一次。此外,usleep可能不如您希望的那样准确,并且您没有考虑计算和输出数据到终端所需的时间。

使用usleep可以节省CPU时间。但是当你想知道向用户显示时间的时间时,你应该使用一个实际得到时间的函数,比如C clock_gettime函数。

答案 1 :(得分:1)

您永远不应该依赖内部累加器来累积经过的墙上时间。这样做不仅可以捕获usleep()所消耗的时间,还可以捕获格式化该字符串和任何其他计算的执行时间(字符串格式可能很大)。

相反,请在开始时获取系统时间。然后,每当您需要采样新的时间时,再次获取系统时间并从现在开始减去开始时间。这将给你经过的时间,然后你可以从那里调整。