Monday, December 27, 2010

Basic pattern for Events in C++/CLI

using namespace System;
using namespace System::Runtime::InteropServices;
using namespace msclr;

public ref class CManaged 
{
public:
    delegate bool CallbackHandler(int);
    // For user to register handler
    event CallbackHandler^ OnCallback
    {
        void add(CallbackHandler^ handler)
        {
            lock lockEvents(this);
            m_callback = (CallbackHandler^) m_callback->Combine(m_callback, handler);
        }
        void remove(CallbackHandler^ handler)
        {
            lock lockEvents(this);
            m_callback = (CallbackHandler^) m_callback->Remove(m_callback, handler);
           
        }
    protected:
        bool raise(int n)
        {
            bool ret = true;
            for each(CallbackHandler^ handler in m_callback->GetInvocationList()){
                ret = ret && handler->Invoke(n);
            }
            return ret;
        }
    }

private:
    CallbackHandler^ m_callback;

public:
    CManaged()
    {
    }
    ~CManaged()
    {
    }

    bool InvokeCallback(int n)
    {
        if(m_callback)
            return m_callback->Invoke(n);
        return false;
    }

    bool Callback(int n)
    {
        printf("%d\n", n);
        return true;
    }
};

int main(array ^args)
{
    CManaged^ c = gcnew CManaged;
    c->OnCallback +=  gcnew CManaged::CallbackHandler(c, &CManaged::Callback);
    c->OnCallback +=  gcnew CManaged::CallbackHandler(c, &CManaged::Callback);

    c->InvokeCallback(1);
    c->InvokeCallback(2);
    return 0;
}

No comments:

Post a Comment