1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/simpost-mult_timer

Клонировать/Скачать
README.md 7.3 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 07.03.2025 15:49 7ea9dcb

шаблон компонента

1. Описание компонента

1.1 Обзор

Это сверхконфигурируемый таймер для Linux, реализованный с использованием механизма epoll и новой возможности timerfd: многозадачные, многопользовательские, многотаймерные задачи. Для создания таймера используется интерфейс TIMER_CREATE(). Вы можете добавить в него десятки тысяч задач таймера с точностью до наносекунды и добавлять различные задачи одновременно!

1.2 Ветки проекта

  • develop: основная ветка разработки, стабильная.

1.3 Версионность

  • V0.1.0:
    • XXXX
    • XXXX
  • v0.2.0:
    • YYYY
    • YYYY

Список исторических версий компонента и описания новых функций.

2. Инструкция по использованию

2.1 Программные интерфейсы

Компонент таймер состоит из следующих типов интерфейсов:

  1. Создание и объявление экземпляра таймера: Первым шагом при работе с таймером является создание экземпляра таймера с помощью TIMER_CREATE(), а также объявление этого экземпляра в других файлах с помощью TIMER_DECLARATION():
TIMER_CREATE(name);
TIMER_DECLARATION(name);
  1. Инициализация и деинициализация таймера: Перед тем как использовать таймер, его следует инициализировать с помощью TIMER_INIT(), где name — это имя экземпляра, а max — максимальное количество задач таймера, которое будет отслеживаться; когда таймер больше не нужен, он может быть деинициализирован с помощью TIMER_DEINIT() (выход из режима работы и освобождение всех ресурсов):
TIMER_INIT(name, max);
TIMER_DEINIT(name);
``````c
TIMER_INIT(name, max);
TIMER_DEINIT(name);
  1. Добавление и удаление задач таймера:
TIMER_ADD(name, itimespec, repeat, cb, data, rb);
TIMER_DEL(name, timerfd);

Функция TIMER_ADD() используется для добавления одной задачи таймера в экземпляр таймера name. Его параметры описаны ниже:

  • itimespec представляет время активации задачи таймера и периодичность выполнения, его структура имеет вид:
struct timespec {
    time_t tv_sec;  // секунды
    long   tv_nsec; // наносекунды
};
struct itimerspec {
    struct timespec it_value;
    struct timespec it_interval;
};
```Здесь `it_value` представляет время истечения (относительное время). Если вы хотите определить циклическую задачу таймера, установите значение `it_interval`; если нет, то оба значения `it_interval` должны быть установлены равными нулю. Таким образом, первое истечение и последующие повторения могут иметь разное время.

- `repeat`  это количество повторений периодического таймера. Если значение равно **-1**, то задача будет выполняться бесконечно; если 0, то задача вообще не выполнится. Таким образом, `repeat` должен быть как минимум равен 1 или можно использовать -1;

- `cb`  это callback-функция, вызываемая при истечении времени работы таймера. Её тип: `void (*timer_callback_t)(void *data)`;

- `data`  это аргумент, передаваемый в callback-функцию таймера, имеет тип `void *`. Пользователи могут указать его как свой определённой структурой данных.

`TIMER_ADD()` добавление задачи в таймер успешно завершается возвратом нового файла-дескриптора таймера, при неудаче возвращается значение < 0. Возвращаемый файл-дескриптор может использоваться для удаления задачи таймера с помощью `TIMER_DEL()`.4. **Получение и очистка задач таймера**

TIMER_COUNT(name); TIMER_CLEAR(name);


`TIMER_COUNT(name)` используется для получения количества текущих задач таймера в экземпляре `name`; `TIMER_CLEAR(name)` используется для очистки всех задач таймера из экземпляра `name`.

### 2.2 Пример использования

Ниже приведён очень простой пример использования: создаются две задачи таймера, каждая первое истечение происходит через 3 секунды, а последующие — каждую секунду; но частота первой задачи составляет 8, а второй — 3; когда все задачи таймера истекут, можно нажать Enter для выхода:

```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include "mt_timer.h"

void timeout_handle(void *arg)
{
    printf("[%ld]:timeout1\n", time(NULL));
}

void timeout_handler(void *arg)
{
    printf("[%ld]:timeout2\n", time(NULL));
}

TIMER_CREATE(test);

int main(void)
{
    int timer;
    struct itimerspec itimespec;

    TIMER_INIT(test, 10);
    itimespec.it_value.tv_sec = 3;
    itimespec.it_value.tv_nsec = 0;
    itimespec.it_interval.tv_sec = 1;
    itimespec.it_interval.tv_nsec = 0;
    
    timer = TIMER_ADD(test, &itimespec, 8, timeout_handle, NULL);
    TIMER_ADD(test, &itimespec, 3, timeout_handler, NULL);
    printf("[%ld]:timer_add : %d\n", time(NULL), TIMER_COUNT(test));
    
    sleep(4); // getchar();
    TIMER_DEL(test, timer);
    printf("[%ld]:timer_del : %d\n", time(NULL), TIMER_COUNT(test));
    TIMER_CLEAR(test);
    printf("[%ld]:timer_clear : %d\n", time(NULL), TIMER_COUNT(test));
    getchar();

    TIMER_DEINIT(test);
    
    return 0;
}

3. Расширенное чтение

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/simpost-mult_timer.git
git@api.gitlife.ru:oschina-mirror/simpost-mult_timer.git
oschina-mirror
simpost-mult_timer
simpost-mult_timer
master