调用函数一段时间

时间:2010-10-12 09:10:08

标签: c++ c linux time timestamp

我想拨打一个电话 - 要么是函数调用,要么是在一段时间内做某些条件......通常是10到20秒。

我会在一段时间内得到一些用户输入并且这样做......

在Linux / Unix系统上使用的正确功能是什么?

gettimeofday似乎是要走的路......或者也许time_t time(time_t * t)......看起来很简单。什么是首选?

4 个答案:

答案 0 :(得分:3)

你想要的是这样吗?这将在接下来的20秒内重复调用myfunc()。因此可以进行1次调用(如果myfunc至少运行20秒)或数百次调用(myfunc()需要几毫秒才能完成):

#include <time.h>

void myfunc()
{
    /* do something */
}    

int main()
{
    time_t start = time(NULL);
    time_t now = time(NULL);
    while ((now - start) <= 20) {
        myfunc();
        time_t now = time(NULL);
    }
}

可能值得问一下你最终想要实现的目标。如果这是用于分析(例如,函数f执行所花费的平均时间量),那么您可能希望查看其他解决方案 - 例如,使用gcc为您提供的内置分析(使用“ -pg“选项”,并用gprof进行分析。

答案 1 :(得分:0)

这可以这样做

#include <ctime>
/*
your function here
*/

    int main()
    {
        double TimeToRunInSecs = ...;
        clock_t c = clock();
        while(double(clock()-c)/CLOCKS_PER_SEC < TimeToRunInSecs)
       {
          myFunc();
       }
    }

标准clock()函数返回进程启动时的SOMETHING数。在一秒钟内有CLOCK_PER_SEC SOMETHINGs:)

HTH

答案 2 :(得分:0)

我可以做一个

time_t current_time = time(0);

并衡量一下......但是有一种首选方式......主要是这是一种最佳实践问题....

X

答案 3 :(得分:0)

一些事情......

如果你想确保函数需要时间X来完成,不管函数中的实际代码花了多长时间,做这样的事情(高度伪代码)

class Delay
{
  public:
    Delay(long long delay) : _delay(delay) // in microseconds
    {
       ::gettimeofday(_start, NULL); // grab the start time...
    }

    ~Delay()
    {
      struct timeval end;

      ::gettimeofday(end, NULL); // grab the end time
      long long ts = _start.tv_sec * 1000000 + _start.tv_usec;
      long long tse = end.tv_sec * 1000000 + end.tv_usec;

      long long diff = tse - ts;
      if (diff < _delay)
      {
        // need to sleep for the difference...
        // do this using select;
        // construct a struct timeval (same as required for gettimeofday)
        fd_set rfds;
        struct timeval tv;
        int retval;

        FD_ZERO(&rfds);

        diff = _delay - diff; // calculate the time to sleep

        tv.tv_sec = diff / 1000000;
        tv.tv_usec = diff % 1000000;

        retval = select(0, &rfds, NULL, NULL, &tv);
        // should only get here when this times out...
      }
    }
  private:
    struct timeval _start;   
};

然后在函数顶部定义一个Delay类的实例来延迟 - 应该做的诀窍......(这段代码未经测试,可能有bug,我只是输入它给你一个想法.. )