Ускорение сигналов2 отслеживания

0

Я использую Boost Signals2 в одном из наших проектов. В этом я хочу автоматическое управление соединениями, для этого я тестирую отслеживание Boost Signals2, но я не получаю слот, вызываемый. После запуска кода, слоты не вызываются. Окружающая среда: VS 2010, Windows 7, повышение 1.54

    #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;
    }

Обновлено: * Работа сейчас *

    #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

Теги:
boost
boost-signals2

1 ответ

0
{
  shared_ptr<Listner> l(new Listner());
  s->Connect(signal_test::slot_type(&Listner::GotSignal,l.get()).track(l));
}

В приведенных выше строках l pointee уничтожается при закрытии } - это означает, что слот, который вы только что связали, истек.

Весь смысл отслеживания - передать track() shared_ptr (или weak_ptr), который связан (или тесно связан) с самим слотом. Не имеет смысла передавать shared_ptr чья продолжительность жизни не связана с жизнью самого слота.

  • 0
    Можете ли вы предложить, где именно я должен создать общий указатель?
  • 0
    @Rushikesh Вам следует изменить дизайн: наследовать Listener от enable_shared_from_this , использовать new для его создания и управлять экземплярами только с помощью shared_ptr . Затем вы сможете отслеживать его продолжительность жизни, передавая shared_from_this() в функцию track() .
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню