Как вставить таймер в всплывающую функцию C ?

#c #timer #timeout

#c #таймер #тайм-аут

Вопрос:

У меня есть эта функция, входным сигналом является var «cmd», например, команда dmesg.

 int i = 0;
char * bufferf;
bufferf = ( char * ) calloc( sizeof ( char ) , 200000 );
char buffer[1000][1280];
memset(buffer,0,1000 * 1280);
memset(bufferf,0,strlen(bufferf));
FILE* pipe = popen(cmd, "r");

if (!pipe){
    send(client_fd,"EXCEPTION",9,0);
}

while(!feof(pipe)) {
    if(fgets(buffer[i], 128, pipe) != NULL)
    {
        strcat(bufferf, buffer [i] );
    }
    i  ;
}
pclose(pipe);
std::cout << bufferf ;
send(client_fd,bufferf,strlen(bufferf),0); }
 

Что ж. Моя цель состоит в том, чтобы вычислить количество времени между началом и концом оператора while, добавляя для каждого раза переменную, которая подсчитывает прошедшее время.

Например, dmesg — это ~ 700 строк вывода. Пока выполняется 700 раз, я должен добавить в 700 раз больше времени, чтобы вычислить общую сумму. Как я могу это сделать? Я пробовал использовать difftime, но это работает не очень хорошо. Есть какие-нибудь другие решения?

Спасибо.

Комментарии:

1. В этом нет необходимости memset(bufferf,0,...) , поскольку bufferf оно уже обнулено из — за calloc(3) . (И выделение мегабайта в стеке может вызвать проблемы — [ stack ] пространство для всех моих процессов в моей системе обычно составляет 132 КБ, при этом один процесс использует 352 КБ стека. Будьте осторожны.)

2. Спасибо! Но мне нужно это измерение для выделения очень больших выходных данных, таких как dmesg и многое другое. Если у вас есть лучшее решение для этого, скажите мне.

3. Вы можете malloc(3) использовать свой огромный буфер 🙂

4. Еще один трюк, пожалуйста. Могу ли я использовать этот calloc со свободной функцией, которая освобождает память?

5. calloc(3) фактически требуется, чтобы вы использовали free(3) для освобождения памяти, когда вы закончите — или вы потеряете выделенную память.

Ответ №1:

Вы могли бы создать чрезвычайно простой класс, который использует clock() для измерения времени:

 #include <ctime>

class Timer
{
   private:
      clock_t _start, _duration;
   public:
      Timer() : _start(0), _duration(0) { }

      void start() { _start = clock(); }
      void stop() { _duration = clock() - _start; }     
      float getTime() { return (float)_duration / CLOCKS_PER_SEC; }
};
 

Очевидно, что умножьте на 1000, если вы хотите отобразить время в миллисекундах.

А потом просто:

 Timer t;
t.start();
// do something
t.stop();

cout << "Duration: " << t.getTime() << endl;
 

Кроме того, обратите внимание на то, что сказал сарнольд, buffer это очень важно.

Комментарии:

1. Хорошо, но CLOCKS_PER_SEC «не удалось разрешить». Я выполнил импорт библиотеки. Что не так? Спасибо

2. @user840718 правда? CLOCKS_PER_SEC должно быть определено в <ctime> (ie. <time.h> ). Вы ведь включили это, не так ли?

3. хм, это устарело, но я думаю, вы могли бы попробовать CLK_TCK . Если это не слишком долго, возможно, вы могли бы предоставить весь свой код, может быть небольшая ошибка.

4. Да, я видел это раньше, попробуй <time.h> вместо <ctime> этого.

5. Сборка без ошибок, но мой вывод dmesg установлен на 0. Я попробую завтра. Спасибо.