zoukankan      html  css  js  c++  java
  • boost库:事件处理

    boost库的signal所实现的模式被命名为信号至插槽,当对应的信号被发出时,相关联的插槽即被执行。

    #include <boost/signal.hpp>
    #include <iostream>
    
    void func() {
      std::cout << "Hello, world!" << std::endl;
    }
    
    int main() {
      boost::signal<void()> s;
      s.connect(func);
      s();
      return 0;
    }

    boost::signal被实现为一个模板函数,具有被用作为事件处理器的函数的签名,该签名也是它的模板参数。上例中,只有签名为void()的函数才可以被成功关联至信号s。当信号s被触发时,func函数被调用。

    上述例子也可以使用boost.function来实现:

    #include <boost/function.hpp>
    #include <iostream>
    
    void func() {
      std::cout << "Hello, world!" << std::endl;
    }
    
    int main() {
      boost::function<void()> f;
      f = func;
      f();
      return 0;
    }

    但signals可以关联多个函数至单个信号,如下:

    #include <boost/signal.hpp>
    #include <iostream>
    
    void func1() {
      std::cout << "Hello" << std::flush;
    }
    
    void func2() {
      std::cout << ", world!" << std::endl;
    }
    
    int main() {
     boost::signal<void()> s;
     s.connect(func1);
     s.connect(func2);
     s();
     return 0;
    }

    boost::signal可以通过反复调用connect()方法来把多个函数赋值给单个特定信号。当该信号被触发时,这些话函数按照之前用connect()关联的顺序来执行。执行顺序也可以通过connect()方法的另一个重载版本来明确指定,如s.connect(1, func2); s.connect(0, func1)

    释放关联,使用disconnect()方法,s.disconnect(func2)。

    s.num_slots() 返回已关联函数的数量。

    s.empty() 是否关联函数。

    s.disconnect_all_slots() 释放所有已有的关联。

    #include <boost/signal.hpp>
    #include <iostream>
    
    int func1() {
      return 1;
    }
    
    int func2() {
      return 2;
    }
    
    int main() {
      boost::signal<int()> s;
      s.connect(func1);
      s.connect(func2);
      std::cout << s() << std::endl; //缺省情况下,所有被关联的函数中,实际上只有最后一个返回值被返回。
      return 0;
    }

    Connections 连接:

    connect()方法会返回一个类型为boost::signals::connection的值。

    #include <boost/signal.hpp>
    #include <iostream>
    
    void func() {
      std::cout << "Hello, world!" << std::endl;
    }
    
    int main() {
      boost::signal<void()> s;
      boost::signals::connection c = s.connect(func);
      s();
      c.disconnect(); //等价于s.disconnect(func)
      return 0;
    }

    int main() {
    boost::signal<void()> s;
    boost::signals::connection c = s.connect(func);
    c.block();
    s(); //虽然触发,但c已经被block()调用阻塞。
    c.unblock(); //unblock()后,func可以被执行。
    s();
    return 0; //func()只会被调用一次。

      boost::signals::scoped_connection c = s.connect(func); 析构时自动释放连接。
    }
  • 相关阅读:
    [国家集训队]数颜色 / 维护队列(带修莫队)
    最大流(三)—— Dinic算法
    最大流(二)—— SAP算法
    最大流(一)—— Edmond-Karp算法
    Arhus University 2000
    USACO 2005 December Gold
    USACO 2004 February
    欧拉函数模版
    最小树形图模板
    线段树模板
  • 原文地址:https://www.cnblogs.com/sssblog/p/10251011.html
Copyright © 2011-2022 走看看