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
|
|
}
|
|
}
|