如何使用浮点数进行超时?

时间:2019-05-18 14:09:53

标签: c time

我想做一个while循环,说“ Hello World”持续2秒500毫秒(2.5s)。我目前编写的代码适用于普通整数,但是如果我将其更改为使用浮点数,它将停止工作

有什么主意吗?

破损的代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[]) {
    float timeout = time(NULL) + 2.5;

    while(time(NULL) < timeout) {
        printf("Hello World\n");
    }

    return 0;
}

2 个答案:

答案 0 :(得分:1)

您的代码存在的问题是:

  1. 您正在使用flaot表示time()的结果,该结果是一个大整数,由于浮点值的性质,可能导致转换不准确。

  2. time()函数的精度只能精确到秒,因此您的代码将永远不会运行2.5秒,而将始终运行3秒,因为您只能按以下步骤进行1秒。

要解决此问题,而无需使用浮点值(由于大多数与时间配合使用的函数都使用整数值,因此没有意义),您可以在Linux上使用gettimeofday()函数,或使用{{ 3}}功能(如果您使用的是Windows。

Linux:

#include <stdio.h>
#include <sys/time.h>

unsigned long long get_time(void) {
    struct timeval time;
    gettimeofday(&time, NULL);

    return time.tv_sec * 1000 * 1000 + time.tv_usec;
}

int main(int argc, char* argv[]) {
    unsigned long long timeout = get_time() + 2500000;
    // Accurate to the microsecond.
    // 2.5 s == 2 500 000 us

    while(get_time() < timeout) {
        printf("Hello World\n");
    }

    return 0;
}

Windows:

#include <stdio.h>
#include <windows.h>

unsigned long long get_time(void) {
    SYSTEMTIME time;
    GetSystemTime(&time);

    return time.wSecond * 1000 + time.wMilliseconds;
}

int main(int argc, char* argv[]) {
    unsigned long long timeout = get_time() + 2500;
    // Accurate to the millisecond.
    // 2.5 s == 2 500 ms

    while(get_time() < timeout) {
        printf("Hello World\n");
    }

    return 0;
}

注意,在Windows上,准确性降低到毫秒,而在Linux上,准确性降低到毫秒。

答案 1 :(得分:-3)

我会坚持使用整数。

您可以这样做:

#include <stdio.h>    
#include <time.h>

int main(int argc, char* argv[]) 
{
  long int timeout = time(NULL)*10 + 25;

  while(time(NULL)*10 < timeout) 
  {
    printf("hello, world\n");
  }

  return 0;
}