C 在没有其他线程的情况下定期运行代码

C 在没有其他线程的情况下定期运行代码,c,time,C,Time,这是我的代码: while(1) { if (fmod(get_elapsed_time(), 3.0) == 0.0) { printf("Hello World\n"); } } get_appeased_time函数返回一个double,它是程序启动以来经过的时间,以秒为单位,以小数点后的毫秒为单位 所以这段代码应该每3秒打印一次hello world,但它没有,我也不知道为什么。浮点不准确。跟踪上次打印内容的时间,当当前时间大于等于

这是我的代码:

while(1)
{
   if (fmod(get_elapsed_time(), 3.0) == 0.0)
   {
       printf("Hello World\n");
   }
}

get_appeased_time
函数返回一个
double
,它是程序启动以来经过的时间,以秒为单位,以小数点后的毫秒为单位


所以这段代码应该每3秒打印一次hello world,但它没有,我也不知道为什么。

浮点不准确。跟踪上次打印内容的时间,当当前时间大于等于3秒时,是打印更多内容的时候了

差不多

float last_print_time = get_elapsed_time();
for(;;) {
  float current_time = get_elapsed_time();
  if (current_time - last_print_time >= 3.0) {
    printf("Beep!\n");
    last_print_time = current_time;
  }
}

浮点不准确。跟踪上次打印内容的时间,当当前时间大于等于3秒时,是打印更多内容的时候了

差不多

float last_print_time = get_elapsed_time();
for(;;) {
  float current_time = get_elapsed_time();
  if (current_time - last_print_time >= 3.0) {
    printf("Beep!\n");
    last_print_time = current_time;
  }
}

用浮点数比较相等总是有风险的,尤其是在试图测量时间时。例如,如果您碰巧在时间2.9999调用了
get_appeased_time()
,又在时间3.0001调用了该函数,则两次调用的模都不会为0。然后,您必须再等待3秒钟才能再次尝试(失败)。@user3386109但如果我将其转换为
int
它会一直打印到下一秒,对于业余程序,只需使用Sleep()或Sleep(),这取决于操作系统。比较浮点数是否相等总是有风险的,尤其是在测量时间的时候。例如,如果您碰巧在时间2.9999调用了
get_appeased_time()
,又在时间3.0001调用了该函数,则两次调用的模都不会为0。然后,您必须再等待3秒钟才能再次尝试(失败)。@user3386109但如果我将其转换为
int
它会一直打印到下一秒,对于业余程序,只需使用Sleep()或Sleep(),具体取决于操作系统。像这样吗<代码>如果(get_time_Passed()-stored_time>=3.0),
stored_time
是循环开始时的时间,如果此条件为真,我将
stored_time
设置为当前时间,我仍然没有得到任何打印的东西。存储时间需要在循环外初始化,然后仅在打印内容时更新。像这样吗?:<代码>如果(get_time_Appeased()-stored_time>=3.0),
stored_time
是循环开始的时间,我将
stored_time
设置为当前时间如果此条件为真,我仍然没有得到任何打印的内容。stored_time需要在循环外初始化,然后仅在打印内容时更新。