• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Error

            C++博客 首頁 新隨筆 聯系 聚合 管理
              217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks
            // boost_singal_solt.cpp : Defines the entry point for the console application.
            //
            #include "stdafx.h"
            #include <iostream>
            #include <string>
            #include <boost/signals2.hpp>
            class CTarget /*: public boost::signals2::trackable*/
            {
            public:
                virtual ~CTarget()
                {
                    std::cout << __FUNCTION__ << std::endl;
                }
                CTarget()
                {
                    m_strMsg = "1343rwkjdfkjdfasdklf";
                }
                void SomeHandle()
                {
                    std::cout << __FUNCTION__ << std::endl;
                    std::cout << m_strMsg << std::endl;
                }
                void SomeHandle1()
                {
                    std::cout << __FUNCTION__ << std::endl;
                }
            private:
                std::string m_strMsg;
            };
            class CSource
            {
            public:
                boost::signals2::connection Connect(const boost::signals2::signal<void(void)>::slot_type &sub)
                {
                    return m_sig.connect(sub);
                }
                void OnSig()
                {
                    m_sig();
                }
            private:
                boost::signals2::signal<void(void)> m_sig;
            };
            int _tmain(int argc, _TCHAR* argv[])
            {
                CSource source;
                boost::signals2::connection conn;
                {
                    CTarget target;
                    
                    /*conn = */source.Connect(boost::bind(&CTarget::SomeHandle, &target));
                    source.Connect(boost::bind(&CTarget::SomeHandle1, &target));
                    source.OnSig();
                }
                source.OnSig();
            return 0;
            }


            在繼承boost::signals2::trackable的情況下,Target析構以后不會調用,但是不繼承是會調用的。也就是說,這是一個危險操作,不知道內部怎么管理的,會不會出現內存泄漏?
            /////////////////////////////////////////////////////////////////////////////


            // boost_singal_solt.cpp : Defines the entry point for the console application.
            //
            #include "stdafx.h"
            #include <iostream>
            #include <string>
            #include <boost/signals2.hpp>
            class CSource
            {
            public:
                boost::signals2::connection Connect(const boost::signals2::signal<void(void)>::slot_type &sub)
                {
                    return m_sig.connect(sub);
                }
                void OnSig()
                {
                    m_sig();
                }
            private:
                boost::signals2::signal<void(void)> m_sig;
            };
            class CTarget : public boost::signals2::trackable
            {
            public:
                virtual ~CTarget()
                {
                    std::cout << __FUNCTION__ << std::endl;
                    m_con.disconnect();
                }
                CTarget()
                {
                    m_strMsg = "1343rwkjdfkjdfasdklf";
                }
                void RegisterSolts(CSource& source)
                {
                    m_con = source.Connect(boost::bind(&CTarget::SomeHandle, this));
                }
                void SomeHandle()
                {
                    std::cout << __FUNCTION__ << std::endl;
                    std::cout << m_strMsg << std::endl;
                }
                void SomeHandle1()
                {
                    std::cout << __FUNCTION__ << std::endl;
                }
            private:
                std::string m_strMsg;
                boost::signals2::connection m_con;
            };
            int _tmain(int argc, _TCHAR* argv[])
            {
                CSource source;
                boost::signals2::connection conn;
                {
                    CTarget target;
                    
                    target.RegisterSolts(source);
                    //source.OnSig();
                }
                source.OnSig();
            return 0;
            }
            確認只要維護好connection在對象target析構以后一定是disconnect應該就OK沒事,,,





            ///////////////////////////////////////////


            整體上看來是這樣:
            問題:target的成員函數和this指針打包注冊到source上以后,如果target析構,source無法感知到,可能會調用已經成為野指針的target地址。
            解決:signals2庫的解決辦法是,用一個connection來維護打包的target成員函數和source上的signal的連接關系。target持有這個connection,當自身析構的時候必須調用disscontion解除這個關系。

            如果要抄襲,也是要設計一種機制,在target析構的時候,想辦法清除它在別處注冊的函數指針。
            1.可以建立target到source的關系,target析構以后通知source,souce清理自身保留的target相關打包函數。這種方式在使用boost bind的時候可能就有問題了,應為之依靠target指針去判斷bind出來的function有難度。
            2.建立關系的時候就將解除關系的函數打包到一個新的對象中,然后由target負責在自己析構的時候去調用它。

            !!!如果source先于target析構,就悲劇了。但是實際情況是,如果source已經析構了,也無法觸發target綁定的函數了。但問題是,target析構的時候還是去觸發source綁定到target的解除關系的函數。悲催。但是實際測試這個問題不存在,估計是用類似weak_ptr的技術。
            在完全理解之前,務必保證source生命周期大于target
            // boost_singal_solt.cpp : Defines the entry point for the console application.
            //
            #include "stdafx.h"
            #include <iostream>
            #include <string>
            #include <boost/signals2.hpp>
            class CSource
            {
            public:
                boost::signals2::connection Connect(const boost::signals2::signal<void(void)>::slot_type &sub)
                {
                    return m_sig.connect(sub);
                }
                void OnSig()
                {
                    m_sig();
                }
            private:
                boost::signals2::signal<void(void)> m_sig;
            };
            class CTarget : public boost::signals2::trackable
            {
            public:
                virtual ~CTarget()
                {
                    //std::cout << __FUNCTION__ << std::endl;
                    m_con.disconnect();
                }
                CTarget()
                {
                    m_strMsg = "1343rwkjdfkjdfasdklf";
                }
                void RegisterSolts(CSource& source)
                {
                    m_con = source.Connect(boost::bind(&CTarget::SomeHandle, this));
                }
                void SomeHandle()
                {
                    std::cout << __FUNCTION__ << std::endl;
                    std::cout << m_strMsg << std::endl;
                }
                void SomeHandle1()
                {
                    std::cout << __FUNCTION__ << std::endl;
                }
            private:
                std::string m_strMsg;
                boost::signals2::connection m_con;
            };
            int _tmain(int argc, _TCHAR* argv[])
            {
                for (;;)
                {
                    CSource* pSource = new CSource;
                    boost::signals2::connection conn;
                    CTarget* pTarget = new CTarget;
                    pTarget->RegisterSolts(*pSource);
                    delete pSource;
                    delete pTarget;
                }
                //source.OnSig();
            return 0;
            }

            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

            沒有完全讀明白之前,在需要7×24運行的環境還是慎重使用。不過客戶端貌似無所謂,,,囧。
            posted on 2014-05-30 01:09 Enic 閱讀(801) 評論(0)  編輯 收藏 引用 所屬分類: boost
            亚洲国产精品无码久久九九| 久久99国产精品尤物| 欧美与黑人午夜性猛交久久久 | 精品无码久久久久久午夜| 99久久精品午夜一区二区| 久久久这里有精品中文字幕| 色综合久久夜色精品国产| 狠狠色婷婷综合天天久久丁香 | 久久精品国产久精国产一老狼| jizzjizz国产精品久久| 精品久久久久成人码免费动漫| 亚洲欧美日韩精品久久| 亚洲乱码精品久久久久..| 久久久久亚洲精品中文字幕| 国产精品无码久久综合| 亚洲精品乱码久久久久久蜜桃图片| 丁香五月综合久久激情| 99久久成人国产精品免费| 久久久久久久波多野结衣高潮 | 久久国语露脸国产精品电影| 国内精品欧美久久精品| 久久综合狠狠综合久久激情 | 久久精品国产亚洲av高清漫画| 2021久久精品免费观看| 日韩精品无码久久一区二区三| 国产精品美女久久久久av爽| 成人a毛片久久免费播放| 久久综合九色综合精品| 嫩草影院久久国产精品| 久久久精品午夜免费不卡| 国产精品禁18久久久夂久| 国产精品久久久久aaaa| 亚洲午夜精品久久久久久人妖| 国产成人香蕉久久久久| 国产高清美女一级a毛片久久w| 99久久精品免费看国产免费| 精品久久久久久无码国产| 久久婷婷人人澡人人| 99精品国产99久久久久久97| 久久亚洲私人国产精品vA | 久久一日本道色综合久久|