Como usar Boost Signals

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

Mas como funciona essa biblioteca?

Basicamente o objetivo dessa biblioteca é para criar sinais de eventos e slots de escuta 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 enviar eventos para 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(&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(&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 de cabeçalho e bibliotecas compiladas 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 deixe nos comentários!

You may also like...

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *