135 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Text;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar
 | 
						|
{
 | 
						|
    internal class ThreadUIOperation
 | 
						|
    {
 | 
						|
        #region Private Variables
 | 
						|
        private bool m_IsActive = false;
 | 
						|
        private System.Threading.ReaderWriterLock m_FadeImageLock = new System.Threading.ReaderWriterLock();
 | 
						|
        private EventHandler m_UpdateUIHandler = null;
 | 
						|
        private EventHandler m_RecordStartStateHandler = null;
 | 
						|
        private EventHandler m_CleanupHandler = null;
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Internal Implementation
 | 
						|
        public ThreadUIOperation(EventHandler recordStartState, EventHandler updateUIHandler, EventHandler cleanup)
 | 
						|
        {
 | 
						|
            m_RecordStartStateHandler = recordStartState;
 | 
						|
            m_UpdateUIHandler = updateUIHandler;
 | 
						|
            m_CleanupHandler = cleanup;
 | 
						|
        }
 | 
						|
 | 
						|
        public bool IsActive
 | 
						|
        {
 | 
						|
            get { return m_IsActive; }
 | 
						|
        }
 | 
						|
 | 
						|
        public void Start()
 | 
						|
        {
 | 
						|
            m_FadeImageLock.AcquireReaderLock(-1);
 | 
						|
            try
 | 
						|
            {
 | 
						|
                if (m_IsActive)
 | 
						|
                    return;
 | 
						|
            }
 | 
						|
            finally
 | 
						|
            {
 | 
						|
                m_FadeImageLock.ReleaseReaderLock();
 | 
						|
            }
 | 
						|
 | 
						|
            bool readerLockHeld = m_FadeImageLock.IsReaderLockHeld;
 | 
						|
            System.Threading.LockCookie cookie1 = new System.Threading.LockCookie();
 | 
						|
            if (readerLockHeld)
 | 
						|
            {
 | 
						|
                cookie1 = m_FadeImageLock.UpgradeToWriterLock(-1);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                m_FadeImageLock.AcquireWriterLock(-1);
 | 
						|
            }
 | 
						|
 | 
						|
            try
 | 
						|
            {
 | 
						|
                m_IsActive = true;
 | 
						|
                m_RecordStartStateHandler.Invoke(this, new EventArgs());
 | 
						|
            }
 | 
						|
            finally
 | 
						|
            {
 | 
						|
                if (readerLockHeld)
 | 
						|
                {
 | 
						|
                    m_FadeImageLock.DowngradeFromWriterLock(ref cookie1);
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    m_FadeImageLock.ReleaseWriterLock();
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            FadeAnimator.Fade(this, new EventHandler(this.OnFadeChanged));
 | 
						|
            m_IsActive = true;
 | 
						|
        }
 | 
						|
 | 
						|
        public void Stop()
 | 
						|
        {
 | 
						|
            m_FadeImageLock.AcquireReaderLock(-1);
 | 
						|
            try
 | 
						|
            {
 | 
						|
                if (!m_IsActive)
 | 
						|
                    return;
 | 
						|
            }
 | 
						|
            finally
 | 
						|
            {
 | 
						|
                m_FadeImageLock.ReleaseReaderLock();
 | 
						|
            }
 | 
						|
            FadeAnimator.StopFade(this, new EventHandler(OnFadeChanged));
 | 
						|
 | 
						|
            bool readerLockHeld = m_FadeImageLock.IsReaderLockHeld;
 | 
						|
            System.Threading.LockCookie cookie1 = new System.Threading.LockCookie();
 | 
						|
 | 
						|
            if (readerLockHeld)
 | 
						|
            {
 | 
						|
                cookie1 = m_FadeImageLock.UpgradeToWriterLock(-1);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                m_FadeImageLock.AcquireWriterLock(-1);
 | 
						|
            }
 | 
						|
 | 
						|
            try
 | 
						|
            {
 | 
						|
                m_IsActive = false;
 | 
						|
                m_CleanupHandler.Invoke(this, new EventArgs());
 | 
						|
            }
 | 
						|
            finally
 | 
						|
            {
 | 
						|
                if (readerLockHeld)
 | 
						|
                {
 | 
						|
                    m_FadeImageLock.DowngradeFromWriterLock(ref cookie1);
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    m_FadeImageLock.ReleaseWriterLock();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void OnFadeChanged(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            m_UpdateUIHandler.Invoke(this, new EventArgs());
 | 
						|
        }
 | 
						|
 | 
						|
        public void StartReadOperation()
 | 
						|
        {
 | 
						|
            m_FadeImageLock.AcquireReaderLock(-1);
 | 
						|
        }
 | 
						|
 | 
						|
        public void EndReadOperation()
 | 
						|
        {
 | 
						|
            m_FadeImageLock.ReleaseReaderLock();
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
}
 |