Фактически, я использовал сигналы и слоты при программировании в 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()
, не так ли?
Не то, что заставило меня подумать, что когда мы пытаемся подключить два разных слота, они вызываются в том же порядке, что и соединение. и если первый слот блокируется (попробуйте добавить бесконечный цикл), то второй слот никогда не будет вызываться! Я предполагаю, что это своего рода вектор, который хранит адреса функций, а затем перебирает цикл и вызывает один за другим!
Какая магия за сигналами и слотами? или это всего лишь абстракция для разработчика?
Заранее спасибо.
Короче: основная идея заключается в развязывании, на мой взгляд.
Дольше: с прямыми вызовами функций вы не могли бы иметь хорошо раздельное установление между общей функциональностью и ее клиентами, например. В отличие от сигналов и слотов, существует жесткая связь, потому что вам нужно будет знать в какой-то момент, удовлетворяющей вашим критериям, какие именно методы нужно вызвать.
Если вы хотите получить больше свободы, например, со многими другими шаблонами проектирования ООП, вам понадобятся сигналы и слоты. Когда общий компонент, позвольте нам назвать его библиотекой, выдает сигнал, он не должен знать о (потенциально еще не существующих) клиентских интерфейсах. Это делает общий компонент достаточно гибким.
Он также будет лучше реагировать на приложение, поскольку он не является прямым вызовом, а обрабатывается циклом событий Qt. Возможно, вы могли бы обойти это с помощью пользовательских механизмов нарезания резьбы, но для этого было бы больше работы, чтобы сделать его достаточно безопасным, и в конце концов вы закончите что-то закрывать.
Boost.Signals2
не представляет никаких циклов / потоков (в отличие от Qt) - слоты просто вызываются синхронно.
Rednaks,
Сигналы и слоты - это просто механизм связи, который может использоваться в разных потоках исполнения. Это основное значение (особенно в графической библиотеке, такой как QT). Обычно существует 1 поток, ответственный за рисование и управление графической частью приложения и 1 или более рабочих потоков. Используя сигналы и слоты, можно отвлечься от этого. Если вы хотите использовать прямые вызовы функций, вам нужно будет синхронизировать потоки, которые приведут к снижению производительности и быстроты реагирования на стороне GUI.
Действительно, в течение одного потока выполнения это не имеет большого смысла, используя сигналы и слоты. Значение приходит, когда вы хотите общаться между процессами (на одной машине или между разными машинами).