• <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)論排行榜

            色综合久久中文综合网| 伊人情人综合成人久久网小说| 香蕉久久夜色精品升级完成| 久久人爽人人爽人人片AV| 久久久青草久久久青草| 怡红院日本一道日本久久 | 精品久久久久久亚洲精品| 99久久这里只有精品| 久久婷婷色综合一区二区| 久久久久久久久无码精品亚洲日韩 | 久久精品无码一区二区三区| segui久久国产精品| 久久精品国产清高在天天线| 久久久久久国产a免费观看黄色大片| 久久亚洲精品成人AV| 久久人妻AV中文字幕| 人妻少妇精品久久| 老司机午夜网站国内精品久久久久久久久| 伊人久久综合成人网| 影音先锋女人AV鲁色资源网久久| 久久97久久97精品免视看| 久久精品国产99国产精品| 天天综合久久一二三区| 亚洲午夜精品久久久久久浪潮| 九九久久精品无码专区| 日本精品久久久久影院日本| 狠狠色丁香婷婷久久综合五月| 久久综合亚洲欧美成人| 久久久综合九色合综国产| 久久综合九色综合久99| 久久99国产综合精品女同| 国内精品欧美久久精品| 一本一本久久A久久综合精品 | 久久免费视频一区| 7777久久久国产精品消防器材| 99精品国产在热久久无毒不卡| 亚洲AⅤ优女AV综合久久久| 精品熟女少妇a∨免费久久| 欧美成人免费观看久久| 国产精品成人久久久久久久| 一本久道久久综合狠狠爱|