zoukankan      html  css  js  c++  java
  • 管理全局对象

    //manage exit ==>delete process object

    class chExitMethodList;
    typedef void (*msgExitMethod)();
    class ETLLIB_DLL_DECLARRE chExitMethodWrap
    {
    friend class chExitMethodList;
    public:
    void onExit();
    public:
    chExitMethodWrap(chExitMethodList* pOwner, msgExitMethod method);
    ~chExitMethodWrap();
    private:
    msgExitMethod m_pMethod;
    chExitMethodList* m_pOwnerList;
    };

    class ETLLIB_DLL_DECLARRE chExitMethodList : public chObjList_stack< chExitMethodWrap* >
    {
    public:
    BOOL AddExitMethod(chExitMethodWrap* pWrap);
    void RemoveExitMethod(chExitMethodWrap* pWrap);
    void ExecuteOnExit();
    };

    //////////////////////////////////////////////////////////////////////////
    // class chExitMethodWrap
    chExitMethodWrap::chExitMethodWrap(chExitMethodList* pOwner, msgExitMethod method)
    {
    m_pOwnerList = pOwner;
    m_pMethod = method;
    pOwner->AddExitMethod(this);
    }

    chExitMethodWrap::~chExitMethodWrap()
    {
    if(m_pOwnerList != NULL)
    {
    m_pOwnerList->RemoveExitMethod(this);
    onExit();
    }
    }

    void chExitMethodWrap::onExit()
    {
    m_pMethod();
    m_pMethod = NULL_METHOD;
    m_pOwnerList = NULL;
    }

    //////////////////////////////////////////////////////////////////////////
    // class chExitMethodList
    BOOL chExitMethodList::AddExitMethod(chExitMethodWrap* pWrap)
    {
    chASSERT(pWrap != NULL_METHOD && !chExitMethodList::has_value(pWrap));
    chExitMethodList::push_front(pWrap);
    return true;
    }

    void chExitMethodList::RemoveExitMethod(chExitMethodWrap* pWrap)
    {
    chExitMethodList::erase_value(pWrap);
    }

    void chExitMethodList::ExecuteOnExit()
    {
    while(!empty())
    {
    chExitMethodWrap* pWrap = front();
    pop_front();
    pWrap->onExit();
    }
    }

    #define DECLARE_PROCESS_OBJECT(type)
    public: static type& getInstance();
    public: static bool hasInstance();
    public: static void releaseInstance();

    #define IMPLEMENT_PROCESS_OBJECT(type)
    static type* s_##type = NULL;
    static bool b_##type##freed = false;
    type& type::getInstance() { static bool bConstructing = false; chASSERT(!b_##type##freed && !bConstructing); if(s_##type == NULL && !b_##type##freed) { bConstructing = true; s_##type = new type(); bConstructing = false; static chExitMethodWrap wrap(&g_uCSystemMessage, type::releaseInstance); } return *s_##type; }
    bool type::hasInstance() { return s_##type != NULL; }
    void type::releaseInstance() { if(s_##type != NULL) { delete s_##type; s_##type = NULL; b_##type##freed = true;} }

    //note    g_uCSystemMessage ==> public chExitMethodList

  • 相关阅读:
    手把手教你利用create-nuxt-app脚手架创建NuxtJS应用
    初识NuxtJS
    webpack打包Vue应用程序流程
    用选择器代替表格列的筛选功能
    Element-UI
    Spectral Bounds for Sparse PCA: Exact and Greedy Algorithms[贪婪算法选特征]
    Sparse Principal Component Analysis via Rotation and Truncation
    Generalized Power Method for Sparse Principal Component Analysis
    Sparse Principal Component Analysis via Regularized Low Rank Matrix Approximation(Adjusted Variance)
    Truncated Power Method for Sparse Eigenvalue Problems
  • 原文地址:https://www.cnblogs.com/hqu-ye/p/4535008.html
Copyright © 2011-2022 走看看