- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
void* execute_thread(void* arg)
{
int i;
int interval;
//Период контроля времени задаётся с точностью в 10мс.
//Контролировать в данной реализации таймера точность в 1мс не имеет смысла,
//так как это почти не возможно и, как правило, не требуется,
//а крутить проверку таймеров с такой частотой только "пожерать" ресурсы процессора.
struct timespec sleep_period = {0,9999999}; //Период, почти 10 мс
do {
for(i=0;i<n_timers;i++){
if(timers[i]->enable == false){
//Если таймер не активный, то присваиваем ему начальное значение
clock_gettime(CLOCK_REALTIME, &timers[i]->time_before);
}
}
//Засыпаем на 10мс
nanosleep(&sleep_period , NULL);
for(i=0;i<n_timers;i++){
if(timers[i]->enable == true){
//Получаем текущее значение времени.
clock_gettime(CLOCK_REALTIME, &timers[i]->time_after);
//Вычисляем прошедшее время ожидания
interval = ((timers[i]->time_after.tv_sec-timers[i]->time_before.tv_sec)*1000000000
+timers[i]->time_after.tv_nsec-timers[i]->time_before.tv_nsec)/1000000;
//Проверяем условие, если ОК, то обновляем время и формируем событие
if(interval >= timers[i]->interval){
clock_gettime(CLOCK_REALTIME, &timers[i]->time_before);
timers[i]->listener->on_time(timers[i]);
}
}
}
} while (terminate == false);
}
PolinaAksenova 24.07.2021 21:15 # 0
Soul_re@ver 24.07.2021 22:14 # +2
JloJle4Ka 25.07.2021 16:13 # 0
gologub 25.07.2021 17:31 # +1
LinuxGovno 24.07.2021 23:32 # 0
ASD_77 25.07.2021 01:16 # 0