Какая польза от сигналов и слотов
На самом деле я использовал сигналы и слоты при программировании на 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 или более рабочих потоков. Используя сигналы и слоты, можно абстрагироваться от этого. Если вы хотите использовать прямые вызовы функций, вам нужно синхронизировать потоки, что приведет к снижению производительности и скорости отклика на стороне графического интерфейса.
Действительно, в одном потоке выполнения не имеет особого смысла использование сигналов и слотов. Значение приходит, когда вы хотите общаться между процессами (на одной машине или между разными машинами).