首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost Signals2跟踪

Boost Signals2跟踪
EN

Stack Overflow用户
提问于 2014-02-27 05:42:21
回答 1查看 2.7K关注 0票数 0

我在我们的Signals2中使用Boost project.In --这是我想要的自动连接管理,为此我正在测试Boost Signals2跟踪,但我不会调用插槽。运行以下代码后,不会调用插槽。环境: VS 2010,windows 7,boost 1.54

代码语言:javascript
复制
    #include <stdio.h>
    #include <iostream>
    #include <string>
    #include <boost/bind.hpp>
    #include <boost/enable_shared_from_this.hpp>
    #include <boost/signals2/signal.hpp>
    #include <boost/shared_ptr.hpp>


    typedef boost::signals2::signal<void ()>  signal_test;
    using namespace boost;

    class SubjectTest
    {

    public:
        void Connect(const signal_test::slot_type &subscriber)
        {
            m_Signal.connect(subscriber);
            std::cout << "No of connections : " << m_Signal.num_slots() << std::endl;
        }
        void Notify()
        {
            m_Signal();
        }
    private:
        signal_test m_Signal;
    };

    class Listner 
    {
    public:
        Listner(){}
        ~Listner(){}
        Listner(std::string name)
        :m_name(name)
        {
        }
        void GotSignal()
        {
            std::cout << m_name <<  std::endl;
        }
        void ConnectWithTracking(SubjectTest *s)
        {
            shared_ptr<Listner> l = new Listner();
            s->Connect(signal_test::slot_type(&Listner::GotSignal,l.get()).track(l));

        }
        void ConnectNormal(SubjectTest *s)
        {
            s->Connect(bind(&Listner::GotSignal,this));

        }

    private:
        std::string m_name;
        shared_ptr<Listner> l;
    };

    void main()
    {
        Listner l2("First"); 
        SubjectTest sub;

        try
        {
        l2.ConnectWithTracking(&sub);
        //l2.ConnectNormal(&sub);
        sub.Notify();

        {
            Listner l3("Second"); 

            l3.ConnectWithTracking(&sub);
            //l3.ConnectNormal(&sub);
            sub.Notify();
        }

        sub.Notify();
        }
        catch(std::exception ex)
        {
            std::cout << ex.what() << std::endl;
        }

        std::cout << "Finish" <<std::endl;
    }

更新: *现在工作*

代码语言:javascript
复制
    #include <stdio.h>
    #include <iostream>
    #include <string>
    #include <boost/bind.hpp>
    #include <boost/enable_shared_from_this.hpp>
    #include <boost/signals2/signal.hpp>
    #include <boost/shared_ptr.hpp>


    typedef boost::signals2::signal<void ()>  signal_test;
    using namespace boost;

    class SubjectTest
    {

    public:
        void Connect(const signal_test::slot_type &subscriber)
        {
            m_Signal.connect(subscriber);
            std::cout << "No of connections : " << m_Signal.num_slots() << std::endl;
        }
        void Notify()
        {
            m_Signal();
        }
    private:
        signal_test m_Signal;
    };

    class Listner : public boost::enable_shared_from_this<Listner>
    {
    public:
        Listner(){}
        ~Listner(){}
        Listner(std::string name)
        :m_name(name)
        {
        }
        void GotSignal()
        {
            std::cout << m_name <<  std::endl;
        }
        void ConnectWithTracking(SubjectTest *s)
        {
            s->Connect(signal_test::slot_type(&Listner::GotSignal,shared_from_this().get()).track(shared_from_this()));
        }
        void ConnectNormal(SubjectTest *s)
        {
            s->Connect(bind(&Listner::GotSignal,this));
        }

    private:
        std::string m_name;

    };

    void main()
    {
        shared_ptr<Listner> l2(new Listner("First")); 

        SubjectTest sub;

        try
        {
        l2->ConnectWithTracking(&sub);

        sub.Notify();

        {
            shared_ptr<Listner> l3(new Listner("Second")); 

            l3->ConnectWithTracking(&sub);
            //l3.ConnectNormal(&sub);
            sub.Notify();
        }

        sub.Notify();
        }
        catch(std::exception ex)
        {
            std::cout << ex.what() << std::endl;
        }

        std::cout << "Finish" <<std::endl;
    }

下面是Signal2自动连接管理的完整示例

EN

回答 1

Stack Overflow用户

发布于 2014-02-27 07:22:23

代码语言:javascript
复制
{
  shared_ptr<Listner> l(new Listner());
  s->Connect(signal_test::slot_type(&Listner::GotSignal,l.get()).track(l));
}

在上面的行中,l切入点在关闭}时被销毁--这意味着您刚刚连接的插槽过期了。

跟踪的全部目的是向track()传递一个shared_ptr (或weak_ptr),该shared_ptr(或weak_ptr)绑定(或紧密相关)到插槽本身。通过一个与插槽本身无关的shared_ptr是没有意义的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22059982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档