Система событий — как сигнал / слот в Qt без разветвления

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

Другими словами, я хотел бы знать теорию, лежащую в основе механизма слотов сигналов Qt или аналогичного.

Я называю Qt без особой причины, просто это, вероятно, одна из наиболее используемых и хорошо протестированных библиотек для этого, так что это справочник в мире C ++, но любая идея о разработке этого механизма будет хорошей.

Благодарю.

0

Решение

На высоком уровне библиотека сигналов / слотов Qt и библиотека сигналов Boost работают как Шаблон наблюдателя (им просто не нужен базовый класс Observer).

Каждый «сигнал» отслеживает, какие «слоты» его наблюдают, а затем выполняет итерацию по всем из них, когда излучается сигнал.

Что касается того, как конкретно реализовать это, C ++ очень похож на код Java в статье в Википедии. Если вы хотите избежать использования интерфейса для всех наблюдателей, boost использует шаблоны, а Qt использует макросы и специальный прекомпилятор (называемый moc).

1

Другие решения

Похоже, вы просите все, но без каких-либо потерь.

Есть несколько общих концепций, которые мне известны для обработки асинхронного ввода и изменений, таких как «нажатие клавиш» и «сенсорные события» и «объект, который изменяет свое собственное состояние».

Большинство из этих концепций и механизмов полезны для всех видов программных потоков и могут пересекать множество границ: процесс, поток и т. Д. Это не самый исчерпывающий список, но он охватывает многие из тех, с которыми я сталкивался.

  • Государственные машины
  • Потоки
  • Сообщения
  • Циклы событий
  • Сигналы и слоты
  • голосование
  • Таймеры
  • Функции обратного вызова
  • Ввод данных
  • трубы
  • Розетки

Я бы порекомендовал исследовать их в Википедии, в Документации Qt или в книге C ++ и посмотреть, что работает или какой механизм вы хотите использовать в своей среде.

Другая действительно хорошая идея — посмотреть, как программисты программистов делали это в прошлом, например, в исходных текстах Linux или как Windows API позволяет вам получать доступ к такого рода информации в своих структурах.

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ: Ответ на комментарий / дополнения к вопросу

Я бы управлял буфером / очередью входящих координат и имел бы метод доступа к последней координате. Затем я бы отслеживал события, такие как начало касания / касания / перетаскивания и его конец, и имел какой-то таймер для времени, когда выполняется длительное касание, и минимальное измерение изменения для того, когда выполняется перетаскиваемое касание ,

Если я использую это только с одной программой, я бы попытался создать интерфейс, похожий на тот, который я мог бы найти в использовании. Я слышал об использовании OpenSoundControl для такого рода ввода. Я создал поток, который собирает координаты и отслеживает события. Затем я опрашиваю эту информацию в программе / классе, которая должна ее использовать.

1

По вопросам рекламы [email protected]