Какая польза от сигналов и слотов

На самом деле я использовал сигналы и слоты при программировании на Qt. Основное использование сигналов и слотов - это взаимодействие с пользовательским интерфейсом, например нажатие кнопки отправляет сигнал, который вызывает слот для выполнения действия. Я знаю, что можно использовать сигналы и слоты для приложений, отличных от графического интерфейса, например, для серверных приложений. Я искал другие библиотеки, которые предлагают сигнал и слоты, и я нашел библиотеку повышения. Это немного отличается от того, что я узнал из Qt. А потом мне стало интересно, в чем же заключается реальная полезность сигналов и слотов, поскольку я могу вручную вызывать функцию для выполнения действия в данный момент времени.

например в boost здесь приведен пример сигналов / слотов:

#include <boost/signals2.hpp>
#include <iostream>

void mySlot(){
  std::cout << "I'm a slot" << std::endl;
}

void main(){
  boost::signals2::signal<void ()> sig;
  // Connecting the slot to the signal.
  sig.connect(mySlot);

  // Emitting a signal that will call mySlot 
  sig();

  return 0;
}

Я мог бы просто сделать то же самое с помощью простого вызова mySlot() не так ли?

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

Что за магия за сигналами и слотами? или это только своего рода абстракция для разработчика?

Заранее спасибо.

2 ответа

Решение

Короче говоря: основная идея, по моему мнению, развязана.

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

Если вы хотите получить больше свободы, как и во многих других шаблонах проектирования ООП, вам нужно что-то вроде сигналов и слотов. Когда общий компонент, назовем его библиотекой, издает сигнал, ему не нужно знать о (потенциально еще не существующих) клиентских интерфейсах. Это делает общий компонент достаточно гибким.

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

Rednaks,

Сигналы и слоты - это просто механизм связи, который можно использовать в разных потоках исполнения. Это главное значение (особенно в ориентированной на GUI библиотеке, такой как QT). Обычно существует 1 поток, отвечающий за рисование и управление графической стороной приложения, и 1 или более рабочих потоков. Используя сигналы и слоты, можно абстрагироваться от этого. Если вы хотите использовать прямые вызовы функций, вам нужно синхронизировать потоки, что приведет к снижению производительности и скорости отклика на стороне графического интерфейса.

Действительно, в одном потоке выполнения не имеет особого смысла использование сигналов и слотов. Значение приходит, когда вы хотите общаться между процессами (на одной машине или между разными машинами).

Другие вопросы по тегам