Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿
我所知的c++插槽系统由3个boost的,sigslot的,sigc++的
这里介绍sigc++的使用

最基本的使用方法:
1.回调函数为一般函数:
代码如下:
 1 #include <iostream>
 2 #include <string>
 3 #include <sigc++/sigc++.h>
 4 
 5 //! 普通函数 
 6 void Print(const std::string& str)
 7 {
 8    std::cout << str;
 9 }
10 
11 int main()
12 {
13    //! 返回值void,参数const std::string&  
14    sigc::signal<voidconst std::string&> signal_print;
15    //! 链接函数 
16    signal_print.connect( sigc::ptr_fun(&Print));
17    //! 发射信号 
18    signal_print.emit("hello world\n");
19   
20    system("pause");
21    return 0;
22 }
2.回调函数为成员函数
 1 #include <iostream>
 2 #include <string>
 3 #include <sigc++/sigc++.h>
 4  
 5 class Printer :public sigc::trackable
 6 {
 7 public:
 8    void Work(){slot.emit("work\n");}    
 9    typedef sigc::signal<voidconst std::string&> Slot;
10    Slot slot;             
11    void Print(const std::string& str){std::cout<<str;}   
12 }; 
13  
14 int main()
15 {
16    Printer printer; 
17    Printer::Slot::iterator iter = printer.slot.connect(sigc::mem_fun(&printer,&Printer::Print));
18    printer.Work();
19    iter->disconnect();
20    printer.Work();
21    
22    system("pause");
23    return 0;
24 }
在sigc++中sigc::ptr_fun负责绑定一般函数
而sigc::men_fun负责绑定成员函数.

可以看到一般的信号插槽系统都具备以下几个函数
a.插槽连接
b.插槽断开
c.信号发射
当然有的插槽信号库还提供其它一些函数
比如对信号设定优先级等等

这是简单实用sigc++的例子
不过若论简单性的话还是sigslot比较好,只有一个头文件

posted on 2010-02-22 16:42 ccsdu2009 阅读(4046) 评论(7)  编辑 收藏 引用
Comments
  • # re: 使用sigc++插槽系统(1)[未登录]
    Apan
    Posted @ 2010-02-23 15:41
    thank you!让我知道了有这个东西。  回复  更多评论   
  • # re: 使用sigc++插槽系统(1)
    空明流转
    Posted @ 2010-02-23 17:24
    boost.signal / thread safe signal  回复  更多评论   
  • # re: 使用sigc++插槽系统(1)
    凡客领带
    Posted @ 2010-02-25 10:08
    很好 123456  回复  更多评论   
  • # re: 使用sigc++插槽系统(1)
    凡客领带
    Posted @ 2010-02-25 10:16
    很好  回复  更多评论   
  • # re: 使用sigc++插槽系统(1)[未登录]
    Apan
    Posted @ 2010-05-17 17:32
    我怀疑sigslot有内存泄露嫌疑,以没有参数说明:当调用connect时,存在这样的代码
    _connection0<desttype, mt_policy>* conn = new _connection0<desttype, mt_policy>(pclass, pmemfun);
    m_connected_slots.push_back(conn);

    而m_connected_slots类型是std::list<_connection_base0<mt_policy> *>,但_connection_base0并没有虚拟的析构函数。  回复  更多评论   
  • # re: 使用sigc++插槽系统(1)
    ccsdu2009
    Posted @ 2010-05-17 17:45
    @Apan
    这个我也注意到了
    其实开源库大部分都有些小问题
    只要修改即可
      回复  更多评论   
  • # re: 使用sigc++插槽系统(1)
    666
    Posted @ 2011-01-01 15:16
    确实感觉有内存泄露,当类的dll中导出时,即使不使用,只要用到类的一个方法就报泄露。  回复  更多评论   

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理