Как и почему можно использовать сигналы Boost2?

Изучение c ++ и попытка познакомиться с некоторыми шаблонами. сигналы2 док Очевидно, что у меня есть широкий спектр возможностей для слотов и сигналов. Я не понимаю, для каких типов приложений (вариантов использования) я должен их использовать.

Я думаю о том, как конечный автомат отправляет события изменений. Исходя из динамически типизированного фона (C #, Java и т. Д.), Вы будете использовать диспетчер событий или статический ref или callback.

Есть ли трудности в c ++ с использованием кросс-классных обратных вызовов? Это по сути Зачем сигналы2 существует?

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

class Document
{
public:
typedef boost::signals2::signal<void ()>  signal_t;

public:
Document()
{}

/* Connect a slot to the signal which will be emitted whenever
text is appended to the document. */
boost::signals2::connection connect(const signal_t::slot_type &subscriber)
{
return m_sig.connect(subscriber);
}

void append(const char* s)
{
m_text += s;
m_sig();
}

const std::string& getText() const
{
return m_text;
}

private:
signal_t    m_sig;
std::string m_text;
};

а также

class TextView
{
public:
TextView(Document& doc): m_document(doc)
{
m_connection = m_document.connect(boost::bind(&TextView::refresh, this));
}

~TextView()
{
m_connection.disconnect();
}

void refresh() const
{
std::cout << "TextView: " << m_document.getText() << std::endl;
}
private:
Document&               m_document;
boost::signals2::connection  m_connection;
};

14

Решение

Boost.Signals2 это не просто «массив обратных вызовов», он имеет большую добавленную стоимость. ИМО, самые важные моменты:

  1. Потоковая безопасность: несколько потоков могут подключать / отключать / вызывать один и тот же сигнал одновременно, не вводя условия гонки. Это особенно полезно при взаимодействии с асинхронной подсистемой, такой как активный объект, работающий в своем собственном потоке.
  2. connection а также scoped_connection ручки, которые позволяют отключение без прямого доступа к signal, Обратите внимание, что это единственный способ отключить несопоставимые слоты, такие как boost::function (или же std::function).
  3. Временная блокировка слотов. Предоставляет чистый способ временно отключить модуль прослушивания (например, когда пользователь просит приостановить получение сообщений в представлении).
  4. Автоматическое отслеживание продолжительности слота: сигнал автоматически отключается от «истекших» слотов. Рассмотрим ситуацию, когда слот является связующим элементом, ссылающимся на не копируемый объект, управляемый shared_ptrs:

    shared_ptr<listener> l = listener::create();
    auto slot = bind(&listener::listen, l.get()); // we don't want aSignal_ to affect `listener` lifespan
    aSignal_.connect(your_signal_type::slot_type(slot).track(l)); // but do want to disconnect automatically when it gets destroyed
    

Конечно, можно реализовать все вышеупомянутые функции самостоятельно, «используя вектор функций и вызывая каждую из них в цикле» и т. Д., Но вопрос в том, как это было бы лучше, чем Boost.Signals2, Изобретать колесо редко бывает хорошей идеей.

22

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector