Como usar Boost Signals

Essa biblioteca é bem interessante para quem deseja replicar o sistema de Signals/Slots de Componentes Visuais do QT.

Mas como funciona essa biblioteca?

Basicamente o objetivo da biblioteca serve para criar signais “Signals” e slots com execução síncrona, ou seja, uma simulação de múltiplos callbacks para um determinado sinal, evento ou função.

Obs. Um sinal pode chamar vários slots e um slot pode ser invocados por vários sinais.

Por exemplo, quando alguém clicar no botão “buscar” quero avisar a janela e as lista de resultado que teve essa ação de clique, como explicado no desenho abaixo:

signals

Como que ficaria esse programa usando Signals/Slots?

#include "stdafx.h"
#include <string>
#include <iostream>
#include <boost\signals2.hpp>
#include <boost\bind.hpp>

using namespace boost::signals2;

class Button {
public:
    Button() {}
    ~Button() {}
public:
    static signal< void( ) > _click;
    void click(){
        std::cout << "before click" << std::endl;
        _click();
        std::cout << "after click" << std::endl;
    }
};

signal< void() > Button::_click;

class Window {
public:
    Window() {
        Button::_click.connect(boost::bind(&amp;Window::refresh, this ));
    }
~Window() {}
public:
    void refresh() {
        std::cout << "refresh window" << std::endl;
    }
};

class Input {
public:
    Input(){}
    ~Input(){}
};

class List {
public:
    List(){
        Button::_click.connect(boost::bind(&amp;List::refresh, this ));
    }
    ~List(){}
public:
    void refresh() {
       std::cout << "refresh list" << std::endl;
    }
};

int main(){
    Window w;
    List l;
    Button b;
    b.click();
    int pause;
    std::cin >> pause;
    return 0;
}

 

O resultado dessa execução é:

before click
refresh window
refresh list
after click

Lógico que a maneira que fiz não é da melhor forma, é somente um caso de estudo.

Estou fazendo alguns exemplo no GitHub, caso queira testar é necessário ter o Visual Studio 2015 e configurar a variável de ambiente BOOST com o diretório aonde está os arquivos da biblioteca no Windows.

Como devo usar o signal e o slot?

Explicação da variável do tipo signal:
signal

Como atribuir um slot a um sinal:
slot

A ordem de execução será conforme a atribuição via função “connect”.

https://github.com/fegomes/boost_signals

Caso tenha alguma dúvida ou sugestão, deixe nos comentários!

Deixe um comentário