Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何缩短测量时差的时间量?_C_Windows - Fatal编程技术网

C 如何缩短测量时差的时间量?

C 如何缩短测量时差的时间量?,c,windows,C,Windows,我试图测量用户的反应时间。我的代码如下所示: int clocks2ms(clock_t range) { return (int)((double)range*1000/CLOCKS_PER_SEC); } clock_t start = clock(); // start measuring while(!kbhit()); // wait for keypress int reaction = clocks2ms(clock()-start); // measure reaction

我试图测量用户的反应时间。我的代码如下所示:

int clocks2ms(clock_t range) {
  return (int)((double)range*1000/CLOCKS_PER_SEC);
}

clock_t start = clock(); // start measuring
while(!kbhit()); // wait for keypress
int reaction = clocks2ms(clock()-start); // measure reaction
反应时间为186ms(+-1ms)、201ms、216ms等,因此存在相等的15ms间隙。有没有办法缩短差距?我试着以实时优先级运行它

start "test" /Realtime "test.exe"

但一切都没有改变。我希望获得1ms的精度。

您必须使用精度更高的计时器,如
GetPerformanceCounter()
():


请注意,在上面的示例代码中,我省略了对
查询…
函数的错误检查。

您必须使用精度更高的计时器,如
GetPerformanceCounter()
():


请注意,在上面的示例代码中,我省略了对
Query…
函数的错误检查。

如果
kbhit()
的时间分辨率是问题所在,那么您可以尝试以下几种替代方法:

  • 由于
    kbhit()
    函数实际上是一个函数,因此使用
    \u kbhit()
    函数可能会获得更好的结果

  • 如果您能够使用
    ncurses
    编译项目,则有一个
    getch()
    函数可以在不等待返回键的情况下获取字符

  • 列出了从控制台获取字符的一些其他方法,这些方法可能会提供更好的结果


  • 如果
    kbhit()
    的时间分辨率是这里的问题,那么您可以尝试以下几种方法:

  • 由于
    kbhit()
    函数实际上是一个函数,因此使用
    \u kbhit()
    函数可能会获得更好的结果

  • 如果您能够使用
    ncurses
    编译项目,则有一个
    getch()
    函数可以在不等待返回键的情况下获取字符

  • 列出了从控制台获取字符的一些其他方法,这些方法可能会提供更好的结果


  • 获得更精确答案的两种方法

    同步启动。与其在一个时钟滴答响的时间内开始某个地方,不如在一次改变后立即开始。这通常会减少启动的“抖动”。这个想法比2更好——它没有得到更精确的答案,但确实提高了准确性

    clock_t prestart = clock();
    clock_t start,end;
    while((start = clock()) == prestart);  //
    puts("Hit Any Key");
    fflush(stdout);
    while(!kbhit()); // wait for keypress
    end = clock();
    int reaction = clocks2ms(end-start); 
    
    结束采样后的时钟周期。这可能会提高精度,但取决于系统的稳定性,也就是说还有多少其他处理在进行

    unsigned count = 0;
    ...
    while(!kbhit()); // wait for keypress
    end = clock();
    while(end == clock()) count++;
    int reaction = clocks2ms(end + (max_cnt_per_tck-count)/max_cnt_per_tck - start); 
    

    当然,这两种方法都不如@uesp所建议的使用更高精度时钟。它们会受到系统实时性方面的影响,例如打印时间的不一致性(
    print()
    ),或者此线程的代码之间可能发生的中断。但是,当没有更精确的时间来源时,它们确实提供了一些改进。

    2获得更精确答案的方法

    同步启动。与其在一个时钟滴答响的时间内开始某个地方,不如在一次改变后立即开始。这通常会减少启动的“抖动”。这个想法比2更好——它没有得到更精确的答案,但确实提高了准确性

    clock_t prestart = clock();
    clock_t start,end;
    while((start = clock()) == prestart);  //
    puts("Hit Any Key");
    fflush(stdout);
    while(!kbhit()); // wait for keypress
    end = clock();
    int reaction = clocks2ms(end-start); 
    
    结束采样后的时钟周期。这可能会提高精度,但取决于系统的稳定性,也就是说还有多少其他处理在进行

    unsigned count = 0;
    ...
    while(!kbhit()); // wait for keypress
    end = clock();
    while(end == clock()) count++;
    int reaction = clocks2ms(end + (max_cnt_per_tck-count)/max_cnt_per_tck - start); 
    
    当然,这两种方法都不如@uesp所建议的使用更高精度时钟。它们会受到系统实时性方面的影响,例如打印时间的不一致性(
    print()
    ),或者此线程的代码之间可能发生的中断。但当没有更精确的时间来源时,它们确实提供了一些改进