• <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輸出的對(duì)象

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


            }

                下面是一段測(cè)試代碼,用于展示如何使用。
            #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);


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


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

            公告

            Using C++

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久无码人妻精品一区二区三区| 午夜人妻久久久久久久久| 成人精品一区二区久久| 精品久久久久久久中文字幕 | 国产亚洲美女精品久久久久狼| 99久久精品费精品国产一区二区| 国产免费久久精品99久久| 无码人妻精品一区二区三区久久 | 久久精品国产精品国产精品污| 久久一区二区免费播放| 成人国内精品久久久久影院| 伊人久久成人成综合网222| 久久久久久久尹人综合网亚洲| 久久精品视频一| 久久夜色撩人精品国产| 久久精品国内一区二区三区| 久久久噜噜噜久久中文字幕色伊伊 | 伊人久久亚洲综合影院| AV狠狠色丁香婷婷综合久久| 亚洲欧美一级久久精品| 国产精品亚洲美女久久久| 国产精品久久自在自线观看| 久久99这里只有精品国产| 久久久久人妻精品一区三寸蜜桃| 国产精品久久久久AV福利动漫| 国产A三级久久精品| 久久亚洲AV无码精品色午夜麻豆| 久久久WWW成人| 久久国产综合精品五月天| 一本伊大人香蕉久久网手机| 欧美一区二区精品久久| 青草影院天堂男人久久| 久久综合九色综合97_久久久| 国产美女久久精品香蕉69| 精品久久久久久国产潘金莲| 99久久精品影院老鸭窝| 99久久婷婷国产一区二区| 久久精品国产清自在天天线| 精品久久久久国产免费| 一级A毛片免费观看久久精品| 久久精品国产亚洲AV蜜臀色欲|