Где / как я могу получить Looper в соответствии со стандартом C ++ или стандартными библиотеками C ++?
Мне нужно спроектировать свою собственную систему обратного вызова и, конечно, она мне нужна для управления моей очередью и моими компонентами.
Петлитель — это то, что при заданной частоте выполняет одну простую вещь: он просто запускает очередь на каждом такте, если вы установите петель 10 мс, каждые 10 мс петлитель будет запускать событие / события в очереди.
Это в основном петлитель, большую часть времени обычно привязанный к ядру, аппаратным часам или чему-то действительно низкоуровневому.
QTimer делает то, что вы хотите — «одиночный выстрел», или, как в вашем случае, срабатывает многократно с заданной (миллисекунды) частотой.
Вы также можете поискать «watch-dog-timer», так как я думаю, что это более распространенный термин, чем «looper».
Если вы хотите перейти на более низкий уровень, некоторые системы (например, Windows) имеют «системные часы» (обычно с разрешением в миллисекунды) и другие высокопроизводительные часы, например «мультимедийные часы» (обычно с разрешением наносекунды). ) если производительность важна.
[РЕДАКТИРОВАТЬ], Итак, я посмотрел видео на тему «что такое петух». Это похоже на стандартную очередь обработки событий. События графического интерфейса запускают сообщения, добавленные в очередь, и «зацикленный» периодически очищает / выполняет очередь сообщений. Особый случай заключается в том, что «looper» также обрабатывает «вызовы локальных сервисов» (на Android, который был темой видео). Итак, кажется, вам просто нужно:
Видео отмечает:
Итак, интересно, но не выглядит особенно сложным для реализации. Это хороший рисунок протектора.
Итак, в этом контексте мое предложение QTimer
будет только частью решения. Звучит так, будто вы хотите, чтобы библиотека очереди сообщений соответствовала ей.
Вы можете использовать некоторые примитивы из новых стандартов C ++ 11 для создания такой вещи.
использование std::thread
а также std::timed_mutex
контролировать чтение цикла из вашего std::queue
,
Поместите классы функторов в свою очередь. Выполнить функторы из цикла потока.
Вы также можете получить его, наоборот, толкая объекты функтора «вверх» по очереди с постоянной частотой и выполняя их со стороны «клиента».
Каким-то образом это сводится к тому, чтобы иметь контролируемый по времени доступ к очереди из потока ‘Looper’. Вы можете использовать, например, std::thread::sleep_for()
чтобы сделать это, или использовать какой-то более сложный механизм, который ведет себя как синхронизированный семафор (например, переменная условия в сочетании с std::timed_mutex
).