LINUX.ORG.RU

Таймеры

 ,


0

1

Хочу создать таймер который будет вызывать функцию каждые n времени. Надыбал такой код:

#include <pthread.h>

void *do_smth_periodically(void *data)
{
  int interval = *(int *)data;
  for (;;) {
    do_smth();
    usleep(interval);
  }
}

int main()
{
  pthread_t thread;
  int interval = 5000;

  pthread_create(&thread, NULL, do_smth_periodically, &interval)

  ...
}
Дураку понятно, что время будет съезжать из-за того, что не учитывается время выполнения do_smth(). Как это исправить?


Не компилируется.

anonymous
()

Дураку понятно, что время будет съезжать из-за того, что не учитывается время выполнения do_smth(). Как это исправить?

А ты, видать не дурак! Даже сформулировать не можешь.

Суть такова: аргумент спячки нужно вычислять, в зависимости от текущего времени и некоего значения, характеризующего либо минимальный интервал (типа не раньше чем через n сек) или максимальный (типа не позже, чем через n сек)

ziemin ★★
()

Только clock_nanosleep(), только хардкор!

dvl36
()

man timer_create

anonymous
()
void *do_smth_periodically(void *data)
{
	int interval = *(int *)data;
	time_t doSmthTimeStamp;
	for (;;) {
		time(&doSmthTimeStamp);
		do_smth();
		usleep(interval - difftime(time(NULL), doSmthTimeStamp));
	}
}
mamba_namba_karamba
()
Ответ на: комментарий от Sorcerer

Ну точно, я и забыл, что это канал про аниме, а не форум программистов. Хорошо, что ты напомнил.

anonymous
()
double dbl_time(){
    double t;
    struct timeval tv;
    gettimeofday(&tv, NULL);
    t = tv.tv_sec + ((double)tv.tv_usec)/1e6;
    return t;
}

Засекаешь t0, а потом уже всегда будешь знать, сколько времени прошло.

Anon
()

usleep(interval);

Кажись, select таки будет работать, в отличие от этой функции.

Anon
()
Ответ на: комментарий от Sorcerer

Кстати о сигналах. ) timerfd. Не совсем сигнал но по fd даст то что нужно.

dvl36
()
  1. Положить начальный момент времени T = now() (man clock_gettime);
  2. Вызвать do_smth()
  3. Положить T = T + n
  4. Заснуть на условной переменной до наступления момента T (man pthread_cond_timedwait)
  5. goto step 2
illy
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.