Вызов функции на определенный период времени - PullRequest
2 голосов
/ 12 октября 2010

Я хочу сделать вызов - либо вызов функции, либо выполнение какого-либо условия в течение ПЕРИОДА времени ... обычно 10 - 20 секунд.

Я хотел бы получить пользовательский ввод для количества времени и сделать это ...

Какую функцию использовать в системах Linux / Unix?

gettimeofday кажется подходящим ... или, возможно, time_t time (time_t * t) ... кажется простым. Что предпочтительнее?

Ответы [ 4 ]

3 голосов
/ 12 октября 2010

Так что-то вроде этого вы хотите?Это будет неоднократно вызывать myfunc () в течение следующих 20 секунд.Поэтому можно выполнить 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.

0 голосов
/ 12 октября 2010

Пара вещей ..

Если вы хотите убедиться, что для завершения функции требуется время 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 в верхней части вашей функции для отсрочки - это нужно сделать ... (этот код не проверен и может содержать ошибки, я просто набрал его, чтобы дать вам представление ...) )

0 голосов
/ 12 октября 2010

Я мог бы сделать

time_t current_time = time(0);

и отмерить это ... но есть ли предпочтительный способ ... в основном это вопрос передового опыта ...

х

0 голосов
/ 12 октября 2010

Это можно сделать так

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

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

стандартная функция clock () возвращает число ЧЕГО от начала процесса. В одну секунду появляются CLOCK_PER_SEC SOMETHING:)

НТН

...