• <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>

            Codejie's C++ Space

            Using C++

            OutputAgentObject:用于Log輸出的對象

            Log的輸出問題是程序設計需要在設計初期就要計劃的一個模塊,其接口和功能的設計,會直接影響整體程序的調試和信息輸出等方面。
                wxDeMPQ在初期,計劃通過其StatusBar作為Log輸出,并簡單封裝了一個函數(shù),但在實際使用中,由于急于實現(xiàn)功能和DLL等的引入,加上VC方便的調試,導致完全廢棄了當初的想法,這也是的wxDeMPQ在后期實現(xiàn)上沒有任何的Log輸出,這對于Debug的程序來說,是--災難和活該。
                對于類似Log輸出的模塊,在實現(xiàn)時需要考慮的是使用時的易融合性和靈活性。簡單地說,一來此模塊的引入不應影響原代碼的執(zhí)行;二來要考慮信息輸出的不確定性,就是說你可能無法預知程序會最終通過什么方式輸出,文件?Console?或者一個EditCtrl?這兩點我認為是需要在初期著重考慮的。
                下面是一個簡單Log輸出模塊的實現(xiàn),通過Adapter方式,連接輸入和輸出。
            #pragma once

            #include 
            <string>

            #ifdef OUTPUTAGENTLIBRARY_EXPORTS
            #define OUTPUTAGENTLIBRARY_API __declspec(dllexport)
            #else
            #define OUTPUTAGENTLIBRARY_API __declspec(dllimport)
            #endif

            namespace OUTPUT
            {

            class OUTPUTAGENTLIBRARY_API COutputBase
            {
            public:
                COutputBase() {}
                
            virtual ~COutputBase() {}

                
            virtual void Output(const std::wstring& info) = 0;
            };

            const unsigned int LEVEL_DEBUG        =    1;
            const unsigned int LEVEL_INFO        =    2;
            const unsigned int LEVEL_WARN        =    4;
            const unsigned int LEVEL_ERROR        =    8;

            const unsigned int LEVEL_ALL        =    0xFFFFFFFF;

            class OUTPUTAGENTLIBRARY_API COutputAgentObject
            {
            public:
                COutputAgentObject();
                
            virtual ~COutputAgentObject();

                
            void SetLevel(unsigned int level);
                unsigned 
            int GetLevel() const;
                
            void SetOutput(COutputBase* output);
                COutputBase 
            * GetOutput() const;

                
            void Output(unsigned int level, const std::wstring& info);
            protected:
                COutputBase
            * _output;
                unsigned 
            int _level;
            };

            }

            //#define OUTPUT(outputptr, level, info) \
            //{\
            //    if(outputptr != NULL) \
            //    {\
            //        std::wostringstream ostr; \
            //        ostr << info; \
            //        outputptr->Output(level, ostr.c_str()); \
            //    }\
            //}

            #include "stdafx.h"

            #include 
            "OutputAgentObject.h"

            namespace OUTPUT
            {

            COutputAgentObject::COutputAgentObject()
            : _output(NULL), _level(LEVEL_ALL)
            {
            }

            COutputAgentObject::
            ~COutputAgentObject()
            {
            }

            void COutputAgentObject::SetLevel(unsigned int level)
            {
                _level 
            = level;
            }

            unsigned 
            int COutputAgentObject::GetLevel() const
            {
                
            return _level;
            }

            void COutputAgentObject::SetOutput(COutputBase* output)
            {
                _output 
            = output;
            }

            COutputBase
            * COutputAgentObject::GetOutput() const
            {
                
            return _output;
            }

            void COutputAgentObject::Output(unsigned int level, const std::wstring& info)
            {
                
            if(_output == NULL)
                    
            return;
                
            if((level & _level) == 0)
                    
            return;
                _output
            ->Output(info);
            }


            }

                下面是一段測試代碼,用于展示如何使用。
            #pragma once

            #include 
            <string>
            #include 
            <sstream>

            #include 
            "wx/wx.h"

            #include 
            "OutputAgentObject.h"

            class COutput : public OUTPUT::COutputBase
            {
            public:
                COutput(wxTextCtrl
            * text)
                    :_text(text)
                {
                }
                
            virtual ~COutput() {}

                
            virtual void Output(const std::wstring& info)
                {
                    
            if(_text != NULL)
                    {
                        _text
            ->AppendText(WString2wxString(info));
                    }
                }
            protected:
                
            const wxString WString2wxString(const std::wstring& str)
                {
                    
            return wxString(str.c_str(), wxConvISO8859_1);
                }
            private:
                wxTextCtrl
            * _text;
            };

            OUTPUT::COutputAgentObject g_stOutputAgent;

            #define OUTPUT(level, info) \
            {\
                std::wostringstream ostr; \
                ostr 
            << info; \
                g_stOutputAgent.Output(level, ostr.str());\
            }

                _output = new COutput(m_textOutput);

                g_stOutputAgent.SetOutput(_output);

                OUTPUT(OUTPUT::LEVEL_INFO, L"Level:" << g_stOutputAgent.GetLevel() << std::endl);


               簡單實現(xiàn),很多因素并不考慮,如Thread Safe問題等,源碼和測試代碼在這里。測試程序模樣如下:


            posted on 2009-06-09 10:52 codejie 閱讀(259) 評論(0)  編輯 收藏 引用 所屬分類: C++

            公告

            Using C++

            導航

            統(tǒng)計

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            99久久国产综合精品女同图片| 97久久精品无码一区二区| 国内精品久久久久久不卡影院| 国产精品久久99| 久久99国产精品二区不卡| 一本大道加勒比久久综合| 久久精品无码av| 欧美日韩精品久久久免费观看| 欧美喷潮久久久XXXXx| 99精品久久久久久久婷婷| 亚洲欧美日韩久久精品| 久久久人妻精品无码一区| 久久久久久伊人高潮影院| 国产精品女同一区二区久久| 久久国产精品免费| 久久国产精品无码一区二区三区| 亚洲国产精品久久久久婷婷软件| 2019久久久高清456| 国产精品成人99久久久久 | 日韩欧美亚洲综合久久影院d3| 精品一久久香蕉国产线看播放| 狠狠色婷婷久久一区二区| 久久se这里只有精品| 久久丫精品国产亚洲av| 欧美精品福利视频一区二区三区久久久精品 | 日韩人妻无码精品久久久不卡 | 香蕉久久一区二区不卡无毒影院| 亚洲精品乱码久久久久久蜜桃不卡| 91精品国产综合久久婷婷| 综合人妻久久一区二区精品| 伊人久久精品影院| 久久精品成人一区二区三区| 色综合久久天天综合| 欧美亚洲另类久久综合| 久久91精品久久91综合| 99麻豆久久久国产精品免费| 久久亚洲精品无码AV红樱桃| 三上悠亚久久精品| 久久久无码一区二区三区| 色婷婷综合久久久久中文一区二区 | 精品国产综合区久久久久久 |