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

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

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

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

Спасибо.


person user1797612    schedule 11.12.2012    source источник
comment
в Qt этот цикл существует, просто он скрыт от пользователя.   -  person UmNyobe    schedule 11.12.2012
comment
Взгляните на библиотеку Boost signal2.   -  person Some programmer dude    schedule 11.12.2012
comment
Сигнал/слоты на самом деле не нуждаются в цикле событий. прямые соединения сигналов/слотов в Qt (по умолчанию, если вы не подключаетесь через потоки) не делают. Большинство соединений сигналов/слотов в Qt представляют собой просто вызовы функций с промежуточным отслеживанием соединений и переадресацией вызова сигнальной функции в слоты.   -  person Frank Osterfeld    schedule 11.12.2012
comment
@UmNyobe Я знаю об этом, это первое фиктивное решение, которое я придумал, я хотел бы знать о более чистом и продуктивном решении, также в QT есть компилятор moc, который делает то, что часто скрыто от пользователя и я хотел бы предоставить то, что библиотека QT и moc предоставляют одновременно, в обычном приложении C++ без использования moc и только с общей цепочкой инструментов компилятора C++.   -  person user1797612    schedule 11.12.2012
comment
@FrankOsterfeld см. мой предыдущий комментарий   -  person user1797612    schedule 11.12.2012
comment
@JoachimPileborg спасибо, но я уже знаю о библиотеках boost, у меня уже есть более 1 решения, если я захочу в будущем обеспечить функциональность сигнала / слота в своем приложении; моя точка зрения такова: нажатие клавиш, сенсорные события, объект, который меняет свое состояние, что общего между этими понятиями с точки зрения программиста? какая теория стоит за этим и как написать систему для обработки сигналов и слотов с нуля без компилятора moc из QT, используя только стандартный набор инструментов C++?   -  person user1797612    schedule 11.12.2012
comment
@user1797612 user1797612 Boost.Signals2 предназначен только для заголовка и не требует moc-компилятора или других дополнительных инструментов.   -  person scai    schedule 12.12.2012
comment
@scai Я хочу сказать, что мне нужно ноу-хау, стоящее за этим.   -  person user1797612    schedule 13.12.2012


Ответы (2)


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

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

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

person Tom Panning    schedule 13.12.2012
comment
в основном без посредников, и действие запускается проверкой присвоения нового значения и обрабатывается каждым классом сигналов? Что у меня осталось: для этого есть определенная структура данных? Я имею в виду, как класс сигналов организует это? - person user1797612; 14.12.2012
comment
Да, сигнальный класс должен каким-то образом знать, когда подавать сигнал наблюдателям. Если сигнал предназначен для изменения значения, то класс должен сам отслеживать это; C++ не имеет возможности следить за изменением переменной. - person Tom Panning; 14.12.2012

Звучит так, как будто вы просите всего, но без каких-либо потерь.

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

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

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

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

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

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

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

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

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

person phyatt    schedule 11.12.2012
comment
Хорошо, предлагаю более конкретный вопрос: у меня есть аппаратный датчик и таймер, у меня нет проблем в чтении данных с датчика, например координаты касания, теперь как я могу построить систему сигнальных слотов, где сигнал изменение координат, а слот - это общий метод или методы? Как управлять очередью? - person user1797612; 11.12.2012
comment
хорошо, но ваш ответ действительно общий, я хотел бы прочитать что-то гораздо более связанное с C++, например, в C++ есть структура данных, которая может уведомлять меня, когда значения ее собственных членов изменяются? Ваш ответ — хорошее начало для того, что я ищу, но он больше похож на алгоритмический подход, а не на подход к реальному этапу программирования или к C++. Надеюсь, теперь понятно, к чему ведет мой вопрос. - person user1797612; 12.12.2012
comment
Не существует структуры данных, которая делает это из коробки. Используя сигнал и слоты, вы можете создавать классы, которые делают это. qt-project.org/doc/qt-4.8/signalsandslots.html Детали реализации mocc'ed можно увидеть в файлах moc_XXX.cpp, которые генерируются qmake. - person phyatt; 12.12.2012