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); 析构时自动释放连接。
    }
  • 相关阅读:
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1131 Subway Map (30 分)
    PAT 甲级 1131 Subway Map (30 分)
    AcWing 906. 区间分组 区间贪心
    AcWing 907. 区间覆盖 区间贪心
  • 原文地址:https://www.cnblogs.com/sssblog/p/10251011.html
Copyright © 2011-2022 走看看