LINUX.ORG.RU

timertt-1.1.0

 ,


0

4

timertt — это маленькая, header-only библиотека для работы с таймерами посредством стандартных средств C++11. Реализует таймеры на основе тайм-аутов, т.е. таймеры, которые должны сработать через сколько-то миллисекунд (секунд, минут и т.д.) после момента активации таймера. wallclock-таймеры не поддерживаются. Может поддерживаться большое количество таймеров (десятки и сотни миллионов) и обеспечивается высокая скорость обработки таймеров (до нескольких миллионов в секунду).

В версии 1.1.0 добавлен новый тип сущности — timer_manager. Timer_manager не создает собственной рабочей нити для отслеживания времени срабатывания таймеров и запуска обработчиков таймеров. Вместо этого timer_manager предоставляет несколько методов, которые пользователь может вызывать в своем собственном цикле обработки событий на той нити, на которой ему это удобно. Чуть больше подробностей здесь.

Библиотека живет на SF.net, там же находится все, что с ней связано:

  • архивы с исходными текстами доступны в секции Files. Архив timertt-1.1.0-headeronly.7z содержит только основной заголовочный файл со всей функциональностью timertt. Архив timertt-1.1.0-full.7z содержит так же тесты, примеры и сгенерированный посредством Doxygen API Reference Manual;
  • основная документация для проекта собрана в Wiki;
  • исходники лежат в Subversion-репозитории на SourceForge. Релизные версии в tags/timertt, находящиеся в разработке версии в branches/timertt.

PS. Предыдущее обсуждение этой библиотеке на LOR-е здесь ;)

★★★★★

Я правильно понимаю, что суть либы в том, что она создает новый поток на каждый таймер, а внутри делает

std::chrono::milliseconds dura(2000);
std::this_thread::sleep_for(dura);

?

Dikar ★★
()
Ответ на: комментарий от Dikar

Не правильно :)

В либе есть два типа сущностей. Первым типом стала такая сущность, как timer_thread. timer_thread создает одну вспомогательную нить, на которой вызываются this_thread::sleep_for. Т.е. на практике, если клиент в нити #1 делает ряд вызовов:

tt.activate(milliseconds(100), act1);
tt.activate(milliseconds(85), act2);
tt.activate(milliseconds(125), act3);
то на вспомогательной нити будет выполняться что-то вроде:
timer_info pauses[] = { {85, act1}, {15, act2}, {25, act3} };
for( p : pauses )
{
  this_thread::sleep_for( milliseconds(p.pause) );
  run( p.action );
}
Только фокус в том, что внутри pauses могут быть десятки и сотни миллионов элементов. Для них поддерживаются операции удаления. А так же повторения, если таймер периодический.

Второй тип сущностей — это timer_manager. Он не создает отдельной нити. Вместо этого клиент после выполнения операций:

tm.activate(milliseconds(100), act1);
tm.activate(milliseconds(85), act2);
tm.activate(milliseconds(125), act3);
должен будет сам делать операции:
// внутри tm есть структура {{85,act1}, {15, act2}, {25, act3}}.

// Заснет на 85ms
this_thread::sleep_for(tm.timeout_before_nearest_timer(milliseconds(1000)));
// Запустит act1.
tm.process_expired_timers();

// внутри tm структура приняла вид {{15, act2}, {25, act3}}.

// Заснет на 15ms
this_thread::sleep_for(tm.timeout_before_nearest_timer(milliseconds(1000)));
// Запустит act2.
tm.process_expired_timers();

// внутри tm структура приняла вид {{15, act2}, {25, act3}}.

// Заснет на 25ms
this_thread::sleep_for(tm.timeout_before_nearest_timer(milliseconds(1000)));
// Запустит act3.
tm.process_expired_timers();

// внутри tm структура стала пустой.

// Заснет на 1000ms
this_thread::sleep_for(tm.timeout_before_nearest_timer(milliseconds(1000)));
// Ничего не запустит.
tm.process_expired_timers();
Ну и, как в случае с timer_thread, timer_manager может обрабатывать десятки и сотни миллионов таймеров.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от deterok

Зачем же так жестоко с малолетними дебилами-то?

eao197 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.