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

0

Фактически, я использовал сигналы и слоты при программировании в Qt. Основное использование сигналов и слотов в взаимодействии с пользовательским интерфейсом, например, нажатая кнопка посылает сигнал, который будет вызывать слот для выполнения действия. Я знаю, что можно использовать сигналы и слоты для не-gui-приложения, например приложения на стороне сервера. Я искал другие библиотеки, которые предлагают сигналы и слоты, и я нашел ускоренную библиотеку. Это несколько отличается от того, что я узнал из 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(), не так ли?

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

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

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

  • 0
    Как бы вы назвали слот из библиотеки, которая будет определена в приложении?
  • 0
    Извините, я не поняла ваш вопрос, не могли бы вы переформулировать, пожалуйста?
Показать ещё 2 комментария
Теги:
qt
boost
qt-signals
qtcore

2 ответа

3
Лучший ответ

Короче: основная идея заключается в развязывании, на мой взгляд.

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

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

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

  • 0
    Обратите внимание, что библиотека Boost.Signals2 не представляет никаких циклов / потоков (в отличие от Qt) - слоты просто вызываются синхронно.
  • 0
    @IgorR .: Кажется, я не написал, что Boost.Signals2 делает.
0

Rednaks,

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

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

  • 0
    Я не согласен с тем, что это главная ценность сигналов и слотов. Разделение является более ценным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню