Я хотел бы знать, как спроектировать систему, которая может предложить прочную основу для обработки сигналов и связи между сигналом / с и методом / с без написания действительно неприятного цикла, который повторяется снова и снова с некоторым оператором для разветвления потока приложения.
Другими словами, я хотел бы знать теорию, лежащую в основе механизма слотов сигналов Qt или аналогичного.
Я называю Qt без особой причины, просто это, вероятно, одна из наиболее используемых и хорошо протестированных библиотек для этого, так что это справочник в мире C ++, но любая идея о разработке этого механизма будет хорошей.
Благодарю.
На высоком уровне библиотека сигналов / слотов Qt и библиотека сигналов Boost работают как Шаблон наблюдателя (им просто не нужен базовый класс Observer).
Каждый «сигнал» отслеживает, какие «слоты» его наблюдают, а затем выполняет итерацию по всем из них, когда излучается сигнал.
Что касается того, как конкретно реализовать это, C ++ очень похож на код Java в статье в Википедии. Если вы хотите избежать использования интерфейса для всех наблюдателей, boost использует шаблоны, а Qt использует макросы и специальный прекомпилятор (называемый moc).
Похоже, вы просите все, но без каких-либо потерь.
Есть несколько общих концепций, которые мне известны для обработки асинхронного ввода и изменений, таких как «нажатие клавиш» и «сенсорные события» и «объект, который изменяет свое собственное состояние».
Большинство из этих концепций и механизмов полезны для всех видов программных потоков и могут пересекать множество границ: процесс, поток и т. Д. Это не самый исчерпывающий список, но он охватывает многие из тех, с которыми я сталкивался.
Я бы порекомендовал исследовать их в Википедии, в Документации Qt или в книге C ++ и посмотреть, что работает или какой механизм вы хотите использовать в своей среде.
Другая действительно хорошая идея — посмотреть, как программисты программистов делали это в прошлом, например, в исходных текстах Linux или как Windows API позволяет вам получать доступ к такого рода информации в своих структурах.
Надеюсь, это поможет.
РЕДАКТИРОВАТЬ: Ответ на комментарий / дополнения к вопросу
Я бы управлял буфером / очередью входящих координат и имел бы метод доступа к последней координате. Затем я бы отслеживал события, такие как начало касания / касания / перетаскивания и его конец, и имел какой-то таймер для времени, когда выполняется длительное касание, и минимальное измерение изменения для того, когда выполняется перетаскиваемое касание ,
Если я использую это только с одной программой, я бы попытался создать интерфейс, похожий на тот, который я мог бы найти в использовании. Я слышал об использовании OpenSoundControl для такого рода ввода. Я создал поток, который собирает координаты и отслеживает события. Затем я опрашиваю эту информацию в программе / классе, которая должна ее использовать.