【问题标题】:How to continuously output the seconds since the start of a calculation with C?如何连续输出自 C 开始计算以来的秒数?
【发布时间】:2014-02-05 18:09:13
【问题描述】:

我正在尝试编写一个在计算期间运行的“实时”计时器。它应该连续输出自计算开始以来的秒数 - 类似于进度条。到目前为止我是这样做的:

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

int main(void)
{
    clock_t t;
    t = clock();

    while (!_kbhit())
    {
        t = clock() - t;
        printf("%f", ((float)t) / CLOCKS_PER_SEC);
        system("cls");
    }

    return 0;
}

但是有几个问题:

  • 由于system("cls")的调用而闪烁。
  • 由于printf()的连续调用,目前时间不正确

有没有一种相当简单的方法可以用 C 来做到这一点?

【问题讨论】:

  • @H2CO3 所说的。另外,如果您不想闪烁,请不要使用cls。只需执行第一个printf,然后执行类似 CR (\\r) 或退格键之类的操作,以在每次迭代时覆盖屏幕上的数字。或者使用curses 库。
  • 没有多线程可以吗?
  • 其实就看作为实际动作做了什么。如果这可以通过异步系统调用完成,那么您也可以在主线程中打印进度,但是如果您需要阻塞,那么您需要多线程。至于闪烁,打印回车应该可以将文本指针移动到行首。如果它只是数学问题,您可以估计更新进度并仍将其打印在与计算相同的线程中的合理频率。
  • 你说结果不正确但是你确定t = clock() - t是你想要的吗?你得到了什么结果,你期待什么?
  • 真的必须那么准确吗?当然,只是表明某事正在发生并且没有停止可能就足够了。如果是这样,那么只需将更新放在不同位置的任务栏。

标签: c++ c time timer clock


【解决方案1】:

一个非常简单但不理想的方法是简单地停止打印如此频繁,所以这里有一个未经测试的代码作为示例,每隔 INTERVAL 时钟打印一次时间。

#define INTERVAL 1000
int main(void)
{
   clock_t t;
   t = clock();
   clock_t step_time = INTERVAL;

   while (!_kbhit())
   {
      t = clock() - t;
      if (t - step_time > INTERVAL){
         step_time = t + INTERVAL;
         printf("%f", ((float)t) / CLOCKS_PER_SEC);
         system("cls");
      }
   }    
return 0;
}

您可以将 INTERVAL 更改为更小的值

【讨论】:

  • t = clock() - t 将在t 的值达到某个值时像拨动开关一样工作。这只会使对 printf 的调用减少 50%。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 2015-11-05
  • 2020-02-14
相关资源
最近更新 更多